wchar&wstring
来自《C++ primer》
The wchar_t type is guaranteed to be large enough to hold any character in the machine’s largest extended character set. The types char16_t and char32_t are intended for Unicode characters.
在VS2015上进行试验,用下面的方式:
wchar_t ch(L'');
cout << hex << ch << endl;
打印字符的unicode16进制编码(VS源码文件为UTF-8带BOM编码,初始化ch的字符来自unicode字符集直接复制得到,网页编码为utf-8,复制得到的字符编码也为utf-8)
试验结果发现,对于unicode字符中,16位编码以下的部分(16位以上全部为0,即0000~ffff这16**4个字符,用这种方式都可以正确打印出对应的编码。如果unicode编号为00A5,打印出来就是00a5,是big-endian的存储);但对之后的编码,打出的编码就不对应了,可能是wchar不再支持(可能因为这部分字符也不再windows最大扩展字符集中,所以wchar不保证支持)
char16_t&u16string
u16string是按照utf16编码来保存字符的
在VS2015上,实验结果表明:
(1)char16_t
一个char16_t只能保存2字节,所以只能用0000~ffff范围内的字符对其进行初始化或赋值,使用比0000 ffff大的编码,直接报错
二进制打印出char16_t的值,严格等于utf16编码,在这个范围内,也就是严格等于unicode编码
(2)u16string
复制一个unicode字符构造一个unicode字符串,用来初始化u16string:
u16string ss(u"X");
如果X在0000~ffff范围内,最终ss会包含两个char16_t,ss[0]严格等于X的unicode编码,ss[1]为终结符001C
如果X在ffff以上的范围内,最终ss会包含两个char16_t,严格等于上面UTF-16编码转换后的4字节
char32_t&u32string
u32string是按照UTF32编码来保存字符的,也就是完全和unicode编码一一对应,,每个字符用32bits来保存
(1)char32_t
一个char32_t四个字节,可以保存所有的unicode字符。但是要注意初始化时,字符常量前要用U
(2)u32string
对于u32string ss(U“你”); ss有两个元素,ss[0]为"你"的unicode编码,ss[1]为0000001c
字符串常量
在VS2015中:
"XXX"的实际类型为const char[]
u8"XXX"的实际类型为const char[]
u"XXX"的实际类型为const char16_t[]
U"XXX"的实际类型为const char32_t[]
L"XXX"的实际类型为const wchar_t[]
初识化对应的字符串或字符时,要注意这些字符串常量的写法,最好对应上写,否则可能出现不能预料的错误(例如char32_t ch('我');ch打印出来不是这个字的unicode编码)
各种类型之间的转换
以上是实践总结的结果,不一定完全准确,如果不妥当的地方,欢迎指正~