C++ 在I/O中使用char16和char32
C++11引入了C++ 在I/O中使用char16和char32,c++,c++11,iostream,char16-t,char32-t,C++,C++11,Iostream,Char16 T,Char32 T,C++11引入了char16\u t和char32\u t,以便于使用UTF-16和UTF-32编码的文本字符串。但是库仍然只支持为多字节I/O定义的实现 为什么没有将对char16\u t和char32\u t的支持添加到库中以补充wchar\u t支持?在提案中指出,只有库工作组支持字符串和编解码器VT方面的新字符类型。显然,大多数人反对支持iostream、fstream、codecvt和regex以外的facet 根据会议记录,“LWG承诺全力支持Unicode,但不打算使用现有图书馆设
char16\u t
和char32\u t
,以便于使用UTF-16和UTF-32编码的文本字符串。但是
库仍然只支持为多字节I/O定义的实现
为什么没有将对char16\u t
和char32\u t
的支持添加到
库中以补充wchar\u t
支持?在提案中指出,只有库工作组支持字符串和编解码器VT方面的新字符类型。显然,大多数人反对支持iostream、fstream、codecvt和regex以外的facet
根据会议记录,“LWG承诺全力支持Unicode,但不打算使用现有图书馆设施的Unicode字符变体复制图书馆。”我没有找到任何细节,但我猜委员会认为当前的图书馆接口不适合Unicode。一个可能的抱怨是,它的设计考虑了固定大小的字符,但Unicode完全摒弃了这一点,因为尽管Unicode数据可以使用固定大小的代码点,但它并没有将字符限制在单个代码点上
我个人认为,没有理由不将各种平台上已经提供的最低限度的支持标准化(Windows对wchar\u t使用UTF-16,大多数Unix平台使用UTF-32)。更高级的Unicode支持将需要新的库设施,但在iostream和Facet中支持char16_t和char32_t不会妨碍,而是会启用基本的Unicode i/o。您是否尝试过
std::basic_iostream
?仅仅因为没有预定义的类型(比如std::iostream
forchar
),并不意味着没有支持。我刚刚在GCC版本4.7.0中测试了basic\u istringstream
。它可以编译,但在执行过程中崩溃。当然,这并不能证明支持可能存在于另一个环境中,但我仍然觉得奇怪的是,标准化委员会没有包括与wchar_______t平等的支持。我的意思是,“…并没有反驳这一点…”。基础是流,应该可以正常工作。如果它不在GCC中,那么它只是一个bug,或者他们还没有达到这个目的。@bames53:除了char
和wchar\u t
之外,该标准不需要支持——所有其他字符类型都是严格的实现定义的,因此不支持它们不一定是一个“bug”@bames53在libstdc++源代码树中没有:@rubenvb是的,libstdc++还没有。据我所知,只有和纯粹的拥有它。但请注意,纯粹的并不意味着MSVC。。。因为我上次检查时,他们没有任何charNN\u t
支持。@rubenvb我知道MSVC至少从2010年起为charX\u t
类型提供了最简单的支持(将char16\u t
和char32\u t
定义为unsigned short
和unsigned int
),但这并不是每个地方都能正常工作。不过,它至少是半功能性的,这在尝试将代码移植回旧版本时很有用。从好的方面来说,至少他们完全承认他们没有为这些类型提供任何实际支持。不利的一面是,不记录typedef可能导致人们在实际上不需要的地方使用wchar\u t
,如果不强迫人们重写可能按原样运行的代码,那将是一个奇迹。