为什么std::u16cout不见了
Why is std::u16cout missing?
C++03定义了两种字符类型:char
和wchar_t
。 (让我们忽略signed char
,unsigned char
疯狂)。
然后这两个字符作为std::string/std::wstring
和std::ostream/std::wostream
应用于std::basic_string
、std::basic_ostream
等。
从流中,标准库还定义了全局std::cout
和std::wcout
。
新的 c++0x 标准定义了另外两种字符类型 char16_t
和 char32_t
。 但是,唯一的新类型定义是 std::u16string
和 std::u32string
.
为什么标准不提供std::u16ostream
? 或者std::u32cout
怎么样?
人们认为实现Unicode iostreams的工作太多了,不值得:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2238.html
摘自论文:
省略两种新类型的流专用化的理由是,非字符类型的流尚未引起广泛使用,因此尚不清楚是否真正需要将这种非常复杂的机制的规格数量增加一倍。据我了解,标准委员会意识到序列化为宽字符(2 字节或 4 字节格式)并不常见,如果您需要 UTF-16 或 UTF-32,
您可以随时使用相同的基于字符的旧字节流自己实现它,但使用编解码器方面将您的输入转换为 UTF-16/UTF-32,它可以将其视为另一种多字节格式。
官方原因。
但我不认为需要一个。
通过拥有特定类型的流,您可以在那里对用法进行硬编码。我更喜欢通用的流(处理字节),然后您可以自定义它们以输出为特定格式。就像他们目前的工作一样。
所以在内部我想使用 UTF16 字符串。但是在输出时,我想将它们序列化为 UTF8 进行存储。为此,我只需创建一个普通的流,使其充满一个知道如何从 UTF16 -> UTF8 转换为的语言环境,然后流需要做的就是处理字节。
让流了解磁盘上的格式对你来说很少。拥有一个可以在不同格式之间转换的区域设置(在设备上到内部,反之亦然)非常方便。