【发布时间】:2011-08-26 14:13:29
【问题描述】:
C++03 定义了两种字符类型:char 和wchar_t。 (让我们忽略 signed char 和 unsigned char 的疯狂)。
然后将这两个字符应用于std::basic_string、std::basic_ostream 等,如std::string/std::wstring 和std::ostream/std::wostream。
标准库还从流中定义了全局变量std::cout 和std::wcout。
新的 c++0x 标准定义了另外两种字符类型 char16_t 和 char32_t。但是,唯一的新 typedef 是 std::u16string 和 std::u32string。
为什么标准不提供std::u16ostream?或者std::u32cout 怎么样?
【问题讨论】:
-
你认为它为什么需要它们?流只是一个字节序列。它是否降低了以不同格式写入和读取流的可能性?不,Once 可以使用 std::ostream 编写一个流并使用 std::u16stream 读取,并且这些流可以正常工作(因此没有额外的保护来防止做错事)。因此,将流读入正确类型的对象的责任仍然落在程序员身上,因为没有真正的方法来确定传入流的类型(它只是一个字节序列)。
-
诚然,
std::u32cout不太可能被经常使用。我只能想象国际化应用程序的控制台输出。但是,std::u32ofstream将立即有用。 -
@deft_code:我不明白这有什么用。您将需要更详细地解释为什么您认为这很有用。您正在将存储格式硬编码到流中,但您无法检测流是否实际上是使用该格式创建的。
-
@Martin:我不太了解你。有没有办法检测 ASCII/Latin-1/UTF-8 流的格式(在这个词的通用、非 C++ 意义上)?您总是需要提前(或通过使用商定的方法)知道您获得的流是使用哪种格式创建的。对于 UTF-x 流,您始终可以使用 BOM 来检测您正在处理的流类型。
-
@Martin:正如我之前所说,使用正确的 codecvt 方面,关心流大小的用途很少。它很可能是一个内部实现细节。但是有非常正当的理由希望 序列化格式 不是 UTF-8,如果您知道自己在做什么,就很容易检测到它。