Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在I/O中使用char16和char32_C++_C++11_Iostream_Char16 T_Char32 T - Fatal编程技术网

C++ 在I/O中使用char16和char32

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,但不打算使用现有图书馆设

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,但不打算使用现有图书馆设施的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
for
char
),并不意味着没有支持。我刚刚在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
,如果不强迫人们重写可能按原样运行的代码,那将是一个奇迹。