n. *_* m. 17 c++ locale wchar-t c++11
我们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');
Run Code Online (Sandbox Code Playgroud)
应输出x?ct是一个合适的区域设置方面.
在实践中几乎没有什么可以保证宽字符集,因为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<std::ctype<wchar_t>>(std::locale()).widen('x')应该L'x'在某些(或任何)语言环境中等于[当x是C++基本源字符集的成员时]
出于与文字相同的原因,在实践中是,在正式中没有(因为支持像EBCDIC这样的编码),并且这对于从业者来说也是无关紧要的.
特别是,对于实践中,更为相关的考虑因素是Microsoft的Visual C++将(未记录的)Windows ANSI作为其执行字符集,将UTF-16作为宽字符编码.例如,在我的机器上,执行字符集是Windows 1252,即Windows ANSI Western.有些字符,特别是€,具有完全不同的Unicode字符代码.更糟糕的是,可能只有一些可用作执行字符集的窄字符集,其中某些字符的UTF-16编码将使用代理对编码值.在这种情况下widen甚至不能代表结果; 它没有空间.
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |