C和UTF8 – 为什么不只是替换ASCII?
在我的应用程序中,我必须不断地将std :: string和std :: wstring之间的字符串转换为不同的API(boost,win32,ffmpeg等).特别是使用ffmpeg,字符串最后会出现在utf8-> utf16-> utf8-> utf16上,只是打开一个文件.
由于UTF8向后兼容ASCII,我以为我一直存储我所有的字符串UTF-8 std :: string,只有当我必须调用某些不寻常的功能时才转换为std :: wstring. 这样做很好,我实现了to_lower,to_upper,iequals为utf8.然而,我遇到了几个死路std :: regex和常规的字符串比较.为了使这个可用,我需要实现基于std :: string的自定义ustring类,并重新实现所有相应的算法(包括正则表达式). 基本上我的结论是utf8对于一般用途来说不是很好.而目前的std :: string / std :: wstring是混乱的. 但是,我的问题是为什么默认std :: string和“”不是简单地更改为使用UTF8?特别是UTF8向后兼容?有可能有一些编译器标志可以做到这一点吗?当然,stl实现需要自动调整. 我看过ICU,但是它与apis不兼容,假设basic_string,例如没有开始/结束/ c_str等… 解决方法
主要问题是内存中表示和编码的混合.
Unicode编码都不是真正适合于文本处理.用户一般会关心字母(屏幕上的内容),而编码是根据代码点定义的,而且一些图形由几个代码点组成. 因此,当一个人问:“Hélène”(法语名字)的第五个字符是什么是问题很混乱: >在字面上,答案是n. 根据问题的来源(她的屏幕前面的最终用户或编码例程),响应是完全不同的. 因此,我认为真正的问题是为什么我们在这里谈论编码? 今天没有意义,我们需要两个“意见”:格式和代码点. 不幸的是,std :: string和std :: wstring接口是继承自人们认为ASCII足够的时间,而进度并没有真正解决问题. 我甚至不明白为什么应该指定内存中的表示,这是一个实现细节.所有用户应该要的是: >能够以UTF- *和ASCII读取/写入 谁在乎它是如何代表的?我以为这个好的软件是建立在封装上的? 那么,C关心,我们想要互操作性…所以我想这将是固定的,当C是. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |