今天我发现,C ++标准委员会已经在第二版中驳回了C ++ 0x中的Unicode流支持。有关详情,请参阅this问题。
根据this文件:
忽略两种新类型的流特化的基本原理是非char类型的流没有被广泛使用,因此不清楚是否真的需要将这种非常复杂的特化数量加倍机械。
来自this采访Stroustrup:
显然,我们应该在标准库中拥有Unicode流和其他大量扩展的Unicode支持。委员会知道但没有任何人有技能和时间来完成这项工作,所以不幸的是,这是你必须寻找“第三方”支持的众多领域之一。
我不是Unicode的专家,我想知道为什么实现Unicode流是如此困难?有什么问题呢?
答案 0 :(得分:5)
你引用的第一段告诉你:并非特别是Unicode流比其他流更困难,因为iostream通常非常复杂。因此,实现Unicode iostream很难,因为它们是Unicode,但因为它们是iostream 。
答案 1 :(得分:3)
论文N2238是从2007年开始的,没有任何相关性。我不确定Stroustrup在采访中特指的是什么,但这不是突发新闻。
N3242§22.5仍然需要codecvt_utf8
和codecvt_utf16
,这些都是Unicode文件I / O所需要的。 imbue
wcout
正确的方面mbstowcs
应该是好的...假设你有一个兼容的库。但是,在实践中,GCC和MSVC已经提供了UTF-8,我希望每个严肃的C ++平台都能保持codecvt
和0x10
之间的平等。
可能存在混淆,因为N3242§22.5/ 5说
- 多字节序列只能作为二进制文件写入。试图写入文本文件 产生不确定的行为。
这是因为文本模式I / O转换行结尾,因此作为16位UTF-16字的一半的0x13, 0x10
字节可以转换为{{1}},从而破坏流。这与糟糕的支持无关......只需确保以二进制模式打开文件,因为您必须使用任何提供此类功能的库。