在c++ 0x中没有Unicode流?为什么

No Unicode Streams in C++0x ? Why?

本文关键字:Unicode 为什么 c++ 0x      更新时间:2023-10-16

今天我发现,c++标准委员会在c++ 0x的第二版中取消了对Unicode流的支持。要了解更多信息,请参阅此问题。

根据本文档:

省略这两种新类型的流专门化的理由是,非char类型的流没有得到广泛的使用,因此不清楚是否真的需要将这种非常复杂的机制的专门化数量增加一倍。

摘自对Stroustrup的采访:

显然,我们应该在标准库中提供Unicode流和其他扩展的Unicode支持。委员会知道这一点,但没有人有技能和时间来做这项工作,所以不幸的是,这是你必须寻找"第三方"支持的众多领域之一。

我不是Unicode专家,我想知道为什么实现Unicode流如此困难?它有什么问题?

你引用的第一段告诉你:并不是Unicode流特别比其他流更困难,而是iostreams一般都非常复杂。因此,实现Unicode iostreams的困难并不是因为它们是Unicode,而是因为它们是iostreams

N2238是2007年的论文,没有相关性。我不确定Stroustrup在采访中具体指的是什么,但这不是什么突发新闻。

N3242§22.5仍然需要codecvt_utf8codecvt_utf16,这是Unicode文件I/O所需的全部。imbue正确的方面到wcout,应该很好去…假设你有一个兼容的库。然而,实际上,GCC和MSVC已经提供了UTF-8,我希望每个严肃的c++平台都保持mbstowcscodecvt之间的平价。

可能会有混淆,因为N3242§22.5/5说

-多字节序列只能作为二进制文件写入。试图写入文本文件产生未定义的行为。

这是因为文本模式I/O转换行结尾,所以0x10字节作为16位UTF-16字的一半可能被转换为0x13, 0x10,从而破坏流。这与支持差无关,只是要确保以二进制模式打开文件,因为您必须使用任何提供此类功能的库。