'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');

应该输出xct 是合适的语言环境方面。

对于宽字符集在实践中几乎没有什么可以保证的,因为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 甚至不能表示结果;没有空间了。