wchar、char_t、char16_t、char32_t

本文介绍了C++中的wchar_t、char16_t和char32_t三种宽字符类型,以及它们在Unicode编码中的应用。通过实验展示了不同类型的字符在Visual Studio 2015中的表现,包括初始化、打印和字符串常量的类型。同时,讨论了不同字符类型的存储限制和转换问题。
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编码)

各种类型之间的转换

以上是实践总结的结果,不一定完全准确,如果不妥当的地方,欢迎指正~
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值