c++ - 'x' 和 L'x' 之间的关系并加宽 ('x' )

标签 c++ c++11 locale wchar-t

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 控制台窗口中使用,并且符合 C 和 C++ 要求。 UTF-16 是 UCS-2 的扩展,它使用两个编码值,称为代理对,用于原始 Unicode 基本多语言平面(也称为 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 的扩展。有一个异常(exception),即 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,也就是 Windows ANSI Western。有些字符,尤其是 €,具有完全不同的 Unicode 字符代码。更糟糕的是,可能只有一些窄字符集可用作执行字符集,其中某些字符的 UTF-16 编码将使用一对代理编码值。在那种情况下widen甚至不能代表结果;没有空间了。

关于c++ - 'x' 和 L'x' 之间的关系并加宽 ('x' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31959761/

相关文章:

c++ - 无法使用迭代器迭代具有数组类型的 GVariant

c++ - 关于 C++ 中的二维数组,我的解决方案有什么问题?

c++ - 字符串数组上的 Sizeof 运算符在 C++ 中给出不同的输出

r - 更改R的时间区域设置

c++ - 带有 SOIL 的 OpenGL 纹理

c++ - Boost.Spirit.Qi - 针对原始数据类型的边界检查

c++ - 在具有相同种子的不同操作系统上实现相同的随机数序列

c++ - 为什么这个 map<int, auto> 是不允许的?

java - 序列化 java.lang.Locale

ruby-on-rails - Rails - 在表单操作中翻译模型名称