为什么缺少std :: u16cout?

时间:2011-05-16 16:23:28

标签: c++ unicode io c++11

C ++ 03定义了两种字符类型:charwchar_t。 (让我们忽略signed charunsigned char精神错乱。)

然后将这两个字符应用于std::basic_stringstd::basic_ostreamstd::string/std::wstringstd::ostream/std::wostream

标准库还从流中定义全局变量std::coutstd::wcout

新的c ++ 0x标准定义了另外两种字符类型char16_tchar32_t。但是,唯一的新typedef是std::u16stringstd::u32string

为什么标准不提供std::u16ostream?或者std::u32cout

怎么样?

2 个答案:

答案 0 :(得分:20)

决定实施Unicode iostream是值得的: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2238.html

来自论文:

忽略这两种新类型的流特化的基本原理是非特征类型的流没有被广泛使用,因此不清楚是否真的需要将这种非常复杂的机器的数量增加一倍。

据我所知,标准委员会意识到序列化为宽字符(2字节或4字节格式)并不常见,而且您需要UTF-16或UTF-32,您可以随时使用相同的旧的基于字符的字节流,但有一个codecvt方面可以将您的输入转换为UTF-16 / UTF-32,它可以视为另一种多字节格式。

答案 1 :(得分:2)

我不知道官方的原因。

但我不认为需要一个 通过拥有特定类型的流,您可以对其进行硬编码。我更喜欢通用的流(句柄字节),然后您可以自定义输出到特定格式。就像他们目前的工作一样。

所以内部我想使用UTF16字符串。但是在输出上我想将它们序列化为UTF8进行存储。为此,我将简单地设法创建一个普通的流,用一个知道如何从UTF16转换的语言环境灌输它 - > UTF8然后所有流需要做的是处理字节。

让流理解你在磁盘上的格式很少。拥有可以在不同格式之间转换的语言环境(在设备上转换为内部,反之亦然)非常方便。