ron*_*nag 9 c++ string unicode visual-studio-2010
在我的应用程序必须不断转换之间的串std::string
并std::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等...
主要问题是内存表示和编码的混合.
Unicode编码都不适合文本处理.用户通常会关注字形(屏幕上的内容),而编码是根据代码点定义的......而一些字形由几个代码点组成.
因此,当有人询问:("Hélène"
法语名字)的第5个字符是什么时,这个问题很混乱:
n
.é
和è
(它们可以被表示作为单一代码点或者作为使用附加符号的一对...)根据问题的来源(屏幕前的最终用户或编码例程),响应完全不同.
因此,我认为真正的问题是为什么我们在这里谈论编码?
今天它没有意义,我们需要两个"观点":字形和代码点.
不幸的是std::string
,std::wstring
接口是从人们认为ASCII足够的时间继承而来的,并且所取得的进展并没有真正解决问题.
我甚至不明白为什么应该指定内存中表示,它是一个实现细节.用户应该想要的是:
......谁在乎它的代表?我认为好的软件建立在封装上?
好吧,C关心,我们想要互操作性......所以我猜它会在C时修复.