C++ 为什么std::u16cout缺失?

C++ 为什么std::u16cout缺失?,c++,unicode,io,c++11,C++,Unicode,Io,C++11,C++03定义了两种字符类型:char和wchar\u t。(让我们忽略有符号字符和无符号字符疯狂) 这两个字符随后应用于std::basic_string,std::basic_ostream等,如std::string/std::wstring和std::ostream/std::wostream 标准库还从流中定义全局变量std::cout和std::wcout 新的c++0x标准定义了另外两种字符类型char16\u t和char32\u t。但是,唯一新的typedef是std::u1

C++03定义了两种字符类型:
char
wchar\u t
。(让我们忽略
有符号字符
无符号字符
疯狂)

这两个字符随后应用于
std::basic_string
std::basic_ostream
等,如
std::string/std::wstring
std::ostream/std::wostream

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

新的c++0x标准定义了另外两种字符类型
char16\u t
char32\u t
。但是,唯一新的typedef是
std::u16string
std::u32string


为什么标准不提供一个
std::u16ostream
?或者一个std::u32cout怎么样?

我不知道官方原因

但我不知道;我看不出有这个必要。
通过使用特定类型的流,您可以在使用中硬编码。我更喜欢通用的流(句柄字节),您可以自定义这些流以输出特定格式。就像他们现在工作一样

所以我想在内部使用UTF16字符串。但在输出时,我想将它们序列化为UTF8存储。为此,我只需要创建一个普通的流,给它注入一个知道如何从UTF16->UTF8转换为的区域设置,然后流需要做的就是处理字节


让流理解磁盘上的格式对您来说没有什么好处。拥有一个可以在不同格式之间转换的区域设置(在设备上转换为内部格式,反之亦然)非常方便。

人们认为实现Unicode iostreams的工作量太大,不值得:

从报纸上看:

省略这两种新类型的流专门化的理由是,非字符类型的流没有得到广泛的使用,因此不清楚是否真的需要将这一非常复杂的机器的专门化数量增加一倍。
据我所知,标准委员会意识到宽字符(2字节或4字节格式)的序列化是不常见的,在需要UTF-16或UTF-32的地方,您可以使用相同的基于字符的字节流自己实现它,但使用codecvt方面将您的输入转换为UTF-16/UTF-32,它可以将其视为另一种多字节格式。

您认为它为什么需要它们?流只是一个字节序列。它是否减少了以不同格式写入和读取流的可能性?不可以。一旦可以用std::ostream编写流,用std::u16stream读取流,这些流就可以正常工作(因此没有额外的保护来防止做错事)。因此,将流读入正确类型的对象的责任仍然落在程序员身上,因为没有真正的方法来确定传入流的类型(它只是一个字节序列)。诚然,
std::u32cout
不太可能经常使用。我只能想象将应用程序的控制台输出国际化。但是,std::u32ofstream会立即有用。@deft_-code:我看不出这有什么用处。你需要更详细地解释为什么你认为这是有用的。您正在将存储格式硬编码到流中,但您没有方法检测流是否确实是使用该格式创建的。@Martin:我不太明白您的意思。有没有一种方法可以检测ASCII/Latin-1/UTF-8流的格式(在通用的、非C++意义上)?您总是需要提前知道(或者通过使用约定的方法)创建的流的格式。在UTF-x流的情况下,您可以随时使用BOM来检测您正在处理的是哪种流。@马丁:正如我前面所说,使用适当的codecvt方面,关心流的大小几乎没有什么用处。它很可能是一个内部实现细节。但是,有非常正当的理由希望序列化格式不是UTF-8,而且如果您知道自己在做什么,它很容易被检测到。有时您会希望序列化为UTF-16或UTF-32-主要是为了与其他软件兼容(例如,某些Windows文件格式使用UTF-16)。但我想你仍然可以使用合适的codecvt方面将它们与普通字节流一起使用。@Boaz Yaniv:我绝对希望能够以特定的格式进行序列化。但我认为这条河不应该控制它。这是本地人将一种表示转换为另一种表示的工作。当您将字符串序列化为文件时,您需要知道序列化的格式,并且在读回字符串时还需要知道这些信息。这是通过在流中注入适当的本地代码来实现的。我讨厌挑剔,但这是“本地”,而不是“本地”。@Martin:我就是这么说的。在流中嵌入codecvt方面可能足以使u32/u16流的大部分使用变得多余。@马丁:那么对你来说,问题是为什么
std::wostream
存在,而不是为什么
std::u16ostream
不存在?