微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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是.

原文地址:https://www.jb51.cc/c/110582.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐