"x"和L'x"和"x"之间的关系

Relationship between 'x' and L'x' and widen('x')

本文关键字:之间 关系      更新时间:2023-10-16

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是一个合适的区域设置facet。

关于宽字符集在实践中几乎没有什么可以保证的,因为C和c++标准要求所有宽字符都可以用单个编码值表示,而Windows编程中的标准是UTF-16编码的宽文本。最初的Windows宽文本只是原始的16位Unicode,现在称为UCS-2,它仍然在Windows控制台窗口中使用,并且符合C和c++的要求。UTF-16是UCS-2的扩展,它使用两个编码值,称为代理对,用于原始Unicode的基本多语言平面(即BMP)之外的字符。


Re

'x'L'x'的整数值一定相等吗?[当x是c++基本源字符集的成员时]

基本的源字符集是ASCII的一个子集,几乎所有现存的通用字符编码,特别是Unicode编码,都是ASCII的扩展。有一个例外,即IBM的EBCDIC字符编码(有多种变体)。然而,如果它仍然在使用,那也是在IBM大型机上。

因此,在实践中,你有这种保证,但在正式场合,你没有。更重要的是,它与无关。例如,基本源字符集缺少$符号,如果没有$符号,你很难做到这一点,也就是说,将自己限制在基本源字符集上并不是一个实际的主张。


Re

在某些(或任何)语言环境中,std::use_facet<std::ctype<wchar_t>>(std::locale()).widen('x')是否应该等于L'x' [当x是c++基本源字符集的成员]

由于与字面量相同的原因,在实践中是,在形式中不是(因为支持EBCDIC之类的编码),而且这与实践者无关。

特别地,在实践中,一个更相关的考虑是微软的Visual c++有(未记录的)Windows ANSI作为它的执行字符集,和UTF-16作为宽字符编码。例如,在我的机器上,执行字符集是Windows 1252,又名Windows ANSI west。有些字符,特别是€,有完全不同的Unicode字符编码。更糟糕的是,可能只有一些狭窄的字符集可以用作执行字符集,其中某些字符的UTF-16编码将使用编码值的代理对。在这种情况下,widen甚至不能表示结果;