use*_*498 7 c++ unicode wchar-t string-literals c++11
来自c ++ 2003 2.13
宽字符串文字具有类型" n const wchar_t的数组 "并具有静态存储持续时间,其中n是字符串的大小,如下所定义
宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止L'\ 0'.
来自c ++ 0x 2.14.5
宽字符串文字的类型为" n const wchar_t的数组 ",其中n是字符串的大小,如下所示
char32_t或宽字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上一个用于终止U'\ 0'或L'\ 0'.
char16_t字符串文字的大小是转义序列,通用字符名称和其他字符的总数,加上需要代理项对的每个字符一个,加上一个用于终止u'\ 0'.
C++ 2003中的陈述非常模糊.但是在C++ 0x中,当计算字符串的长度时,宽字符串文字wchar_t应被视为与char32_t相同,并且与char16_t不同.
有一篇文章明确说明了windows如何在/sf/ask/28159841/?tab=votes%23tab-top中实现wchar_t
简而言之,Windows中的wchar_t是16位并使用UTF-16编码.标准中的陈述显然在Windows中留下了一些冲突.
例如,
wchar_t kk[] = L"\U000E0005";
Run Code Online (Sandbox Code Playgroud)
这超过16位,对于UTF-16,它需要两个16位来编码它(代理对).
但是,从标准来看,kk是2个wchar_t的数组(1表示通用名称\ U000E005,1表示\ 0).
但是在内部存储中,Windows需要3个16位wchar_t对象来存储它,2个wchar_t用于代理对,1个wchar_t用于\ 0.因此,从数组的定义来看,kk是一个3 wchar_t的数组.
这显然是相互冲突的.
我认为Windows的一个最简单的解决方案是"禁止"在wchar_t中需要代理对的任何东西("禁止"在BMP之外的任何unicode).
我的理解有什么不对吗?
谢谢.
该标准要求wchar_t
足够大以容纳支持的字符集中的任何字符。\U000E0005
基于此,我认为你的前提是正确的——VC++用两个单位表示单个字符是错误的wchar_t
。
BMP 之外的字符很少使用,而且 Windows 本身内部使用 UTF-16 编码,因此 VC++ 这样做很方便(即使不正确)。wchar_t
然而,与“禁止”此类字符不同,未来的大小很可能会增加,同时char16_t
在 Windows API 中占据一席之地。
您链接到的答案也有些误导:
在Linux上,a
wchar_t
是4字节,而在Windows上,它是2字节
的大小wchar_t
仅取决于编译器,与操作系统无关。碰巧 VC++ 使用 2 个字节来表示wchar_t
,但是,这在将来很可能会发生变化。
归档时间: |
|
查看次数: |
4965 次 |
最近记录: |