C++和UTF8 - 为什么不直接替换ASCII?

ron*_*nag 9 c++ string unicode visual-studio-2010

在我的应用程序必须不断转换之间的串std::stringstd::wstring由于不同的API(升压,win32的,ffmpeg的等).特别是对于ffmpeg,字符串结束utf8-> utf16-> utf8-> utf16,只是为了打开一个文件.

由于UTF8向后兼容ASCII,我认为我一直存储所有字符串UTF-8,std::string并且仅std::wstring在我必须调用某些不寻常的函数时才转换.

这样做很好,我为utf8实现了to_lower,to_upper,iequals.然而,我遇到了几个死胡同std :: regex,以及常规的字符串比较.为了使这个可用,我需要实现一个ustring基于std :: string 的自定义类,并重新实现所有相应的算法(包括正则表达式).

基本上我的结论是utf8对于一般用法并不是很好.目前std::string/std::wstring很糟糕.

但是,我的问题是为什么默认std::string并且""不是简单地改为使用UTF8?特别是因为UTF8向后兼容?可能有一些编译器标志可以做到这一点吗?当然,需要自动调整stl实现.

我看过ICU,但它与apis假设basic_string不太兼容,例如没有begin/end/c_str等...

Mat*_* M. 8

主要问题是内存表示和编码的混合.

Unicode编码都不适合文本处理.用户通常会关注字形(屏幕上的内容),而编码是根据代码点定义的......而一些字形由几个代码点组成.

因此,当有人询问:("Hélène"法语名字)的第5个字符是什么时,这个问题很混乱:

  • 就字形而言,答案是n.
  • 在码点而言...这取决于的表示éè(它们可以被表示作为单一代码点或者作为使用附加符号的一对...)

根据问题的来源(屏幕前的最终用户或编码例程),响应完全不同.

因此,我认为真正的问题是为什么我们在这里谈论编码?

今天它没有意义,我们需要两个"观点":字形和代码点.

不幸的是std::string,std::wstring接口是从人们认为ASCII足够的时间继承而来的,并且所取得的进展并没有真正解决问题.

我甚至不明白为什么应该指定内存中表示,它是一个实现细节.用户应该想要的是:

  • 能够以UTF-*和ASCII读/写
  • 能够在字素上工作
  • 能够编辑字形(管理变音符号)

......谁在乎它的代表?我认为好的软件建立在封装上?

好吧,C关心,我们想要互操作性......所以我猜它会在C时修复.