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