'x' 与 L'x' 和 widen('x') 的关系
Relationship between 'x' and L'x' and widen('x')
设x
为基本源字符集的任何成员。 'x'
和L'x'
分别是基本执行字符集和基本执行宽字符集的成员。
'x'
和L'x'
的整数值一定要相等吗?看起来标准没有要求,这是有道理的。可以想象使用 EBCDIC 作为窄字符集,使用 Unicode 作为宽字符集。
在某些(或任何)语言环境中 std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
应该等于 L'x'
是真的吗?在这种情况下,要求这样做确实有意义,但我在标准中也找不到这样的要求。同样,std::use_facet<std::ctype<wchar_t>>(std::locale()).narrow(L'x')
是否与 'x'
相同?
如果以上不正确,那么是哪一个
std::wcout << L'x';
std::wcout << ct.widen('x');
应该输出x
? ct
是合适的语言环境方面。
对于宽字符集在实践中几乎没有什么可以保证的,因为C和C++标准要求所有的宽字符都可以用一个编码值来表示,而Windows编程中的标准是UTF-16 编码的宽文本。原来Windows宽文本只是原始的16位Unicode,现在称为UCS-2,仍在Windows控制台windows中使用,符合C和C++要求。 UTF-16 是 UCS-2 的扩展,它使用两个编码值,称为代理对,用于原始 Unicode 的基本多语言平面 a.k.a 之外的字符。 BMP.
回复
” Is it true that integral values of 'x'
and L'x'
must be equal? [When x is a member of the C++ basic source character set]
基本源字符集是ASCII的子集,几乎所有现存的通用字符编码,特别是Unicode编码,都是ASCII的扩展。有一个例外,即 IBM 的 EBCDIC 字符编码(有多种变体)。但是,如果它仍然在使用,那就是在 IBM 大型机上。
因此在实践中你有这种保证,但在正式场合你没有。不过,更重要的是,它 无关紧要 。例如,基本源字符集缺少 $ 符号,你很难期望没有它,即限制自己使用基本源字符集是不现实的主张。
回复
” Is it true that std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
should be equal to L'x'
in some (or any) locale [When x is a member of the C++ basic source character set]
出于与文字相同的原因,在实践中是,在正式中不是(因为支持 EBCDIC 等编码),而且这与从业者无关。
特别是,对于实践,一个更相关的考虑是微软的 Visual C++ 有(未记录的)Windows ANSI 作为其执行字符集,UTF-16 作为宽字符编码。例如。在我的机器上,执行字符集是 Windows 1252,a.k.a。 Windows ANSI 西方。有些字符,尤其是 €,具有完全不同的 Unicode 字符代码。更糟糕的是,可能只有一些窄字符集可以用作执行字符集,其中某些字符的 UTF-16 编码将使用一对代理项编码值。在那种情况下 widen
甚至不能表示结果;没有空间了。
设x
为基本源字符集的任何成员。 'x'
和L'x'
分别是基本执行字符集和基本执行宽字符集的成员。
'x'
和L'x'
的整数值一定要相等吗?看起来标准没有要求,这是有道理的。可以想象使用 EBCDIC 作为窄字符集,使用 Unicode 作为宽字符集。
在某些(或任何)语言环境中 std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
应该等于 L'x'
是真的吗?在这种情况下,要求这样做确实有意义,但我在标准中也找不到这样的要求。同样,std::use_facet<std::ctype<wchar_t>>(std::locale()).narrow(L'x')
是否与 'x'
相同?
如果以上不正确,那么是哪一个
std::wcout << L'x';
std::wcout << ct.widen('x');
应该输出x
? ct
是合适的语言环境方面。
对于宽字符集在实践中几乎没有什么可以保证的,因为C和C++标准要求所有的宽字符都可以用一个编码值来表示,而Windows编程中的标准是UTF-16 编码的宽文本。原来Windows宽文本只是原始的16位Unicode,现在称为UCS-2,仍在Windows控制台windows中使用,符合C和C++要求。 UTF-16 是 UCS-2 的扩展,它使用两个编码值,称为代理对,用于原始 Unicode 的基本多语言平面 a.k.a 之外的字符。 BMP.
回复
” Is it true that integral values of
'x'
andL'x'
must be equal? [When x is a member of the C++ basic source character set]
基本源字符集是ASCII的子集,几乎所有现存的通用字符编码,特别是Unicode编码,都是ASCII的扩展。有一个例外,即 IBM 的 EBCDIC 字符编码(有多种变体)。但是,如果它仍然在使用,那就是在 IBM 大型机上。
因此在实践中你有这种保证,但在正式场合你没有。不过,更重要的是,它 无关紧要 。例如,基本源字符集缺少 $ 符号,你很难期望没有它,即限制自己使用基本源字符集是不现实的主张。
回复
” Is it true that
std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')
should be equal toL'x'
in some (or any) locale [When x is a member of the C++ basic source character set]
出于与文字相同的原因,在实践中是,在正式中不是(因为支持 EBCDIC 等编码),而且这与从业者无关。
特别是,对于实践,一个更相关的考虑是微软的 Visual C++ 有(未记录的)Windows ANSI 作为其执行字符集,UTF-16 作为宽字符编码。例如。在我的机器上,执行字符集是 Windows 1252,a.k.a。 Windows ANSI 西方。有些字符,尤其是 €,具有完全不同的 Unicode 字符代码。更糟糕的是,可能只有一些窄字符集可以用作执行字符集,其中某些字符的 UTF-16 编码将使用一对代理项编码值。在那种情况下 widen
甚至不能表示结果;没有空间了。