【问题标题】:Relationship between 'x' and L'x' and widen('x')'x' 和 L'x' 之间的关系以及加宽('x')
【发布时间】:2015-11-04 17:46:29
【问题描述】:

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 是适当的语言环境方面。

【问题讨论】:

  • Microsoft 的编译器将 Windows ANSI 作为窄字符集,将 Unicode 作为宽字符集。即使 Windows ANSI 是 Windows ANSI Western,代码也不相同。特别麻烦,欧元符号€。
  • @Cheersandhth.-Alf € 不在基本源字符集中,这里没问题。
  • 根据安装 Windows 的国家语言,€ 在执行字符集中。这包括美国和挪威。您必须忽略一些指出执行字符集是 ASCII 的错误文档,因为相信它您最终会生成结果不正确的程序,并且无法理解编译器的警告。 ;-)
  • @Cheersandhth.-Alf C++ 标准修复了 [lex.charset] 中基本源字符集的所有 96 个成员。 € 不是会员。
  • ↑ 很抱歉重复您使用“基本源字符集”(现已编辑、更正)。我并没有停下来认为这是不正确的。基本源字符集的字符集是 ASCII 减去几个字符,例如 $。不使用 $ 是不切实际的,你不是说吗?

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


【解决方案1】:

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


回复

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

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

因此在实践中你有这个保证,但在正式的时候你没有。不过,更重要的是,它无关。例如,基本源字符集缺少 $ 符号,你几乎不能指望没有它,即限制自己使用基本源字符集不是一个实际的提议。


回复

在某些(或任何)语言环境中std::use_facet&lt;std::ctype&lt;wchar_t&gt;&gt;(std::locale()).widen('x')是否应该等于L'x'是真的吗[当x是C++基本源字符集的成员时]

出于与文字相同的原因,在实践中是,在形式上不是(因为支持像 EBCDIC 这样的编码),而且这与从业者无关。

特别是在实践中,一个更相关的考虑是微软的 Visual C++ 有(未记录的)Windows ANSI 作为其执行字符集,而 UTF-16 作为宽字符编码。例如。在我的机器上,执行字符集是 Windows 1252,也就是 Windows ANSI Western。有些字符,尤其是 €,具有完全不同的 Unicode 字符代码。更糟糕的是,可能只有一些窄字符集可用作执行字符集,其中某些字符的 UTF-16 编码将使用一对代理编码值。在那种情况下,widen 甚至不能代表结果;没有空间了。

【讨论】:

  • Visual C++ 不符合标准,因为某些字符不能表示为单个 wchar_t。如果我们排除这些字符并假设我们只使用 UCS-2,那么一切看起来都不错,因为 Windows ANSI 和 UCS-2 的前 127 个字符可能在任何代码页中都相同。
  • @n.m.:你说得对,Visual C++ 以及所有其他 Windows C 和 C++ 编译器 都正式不合格。 AFAIK 这是由于 1990 年代 C 和 C++ 委员会中的愚蠢政治,标准化的措辞与非常稳固的实践不相容。这意味着正式在这方面并不能真正帮助您,因为这里的正式质量非常低(纯粹是政治),完全无法使用。
  • " C 和 C++ 标准要求所有宽字符都可以用单个编码值表示" 引用?
  • @Yakk 3.9.1 [basic.fundamental]/5 “类型 wchar_t 是一种不同的类型,其值可以表示支持的语言环境中指定的最大扩展字符集的所有成员的不同代码”。
  • @n.m.只要字符集不是字符集,就可以工作。嘎。
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 2013-02-16
  • 1970-01-01
  • 2021-10-07
  • 2018-10-22
  • 2013-06-14
  • 2011-06-10
  • 2017-03-02
相关资源
最近更新 更多