4字节UTF16编码和对C++/Java的影响

13 篇文章 0 订阅

UTF16也可以占据4个byte

不要被UTF16这个名字骗了,UTF16编码也有可能占据4个byte。

比如,把下面的四个字符,用Notepad工具选择UTF16编码保存为txt文件就可以发现,每个字符都占据了4个bytes。


原因是,在远古时代,unicode字符的code point的范围是0x0000-0xffff,因此UTF16编码也都是16位。但后来unicode的code point可以超过16位了(0x0-0x10FFFF),UTF16编码也与时俱进,code point小于0xffff的字符仍然占据2Bytes,超过的就用4个bytes表示。


C++与UTF16

VC下,sizeof(wchar_t) = 2,因此无法表示所有的unicode字符。但是gcc下sizeof(wchar_t) == 4,这个才是完善的。



Java与UTF16

Java中,char类型虽然采用UTF16编码,但它只占据两个byte,因此无法表示一些特殊字符。
以下是JVM规范对char类型的描述:
"char,  whose  values  are  16-bit  unsigned  integers  representing  Unicode  code
points in the Basic Multilingual Plane, encoded with UTF-16, and whose default
value is the null code point ('\u0000')."

Java中的String类型也采用UTF16编码,但它不受两个byte的限制,以下为javadoc对String的描述:
"A String represents a string in the UTF-16 format in which supplementary characters
are represented by surrogate pairs (see the section Unicode Character Representations
in the Character class for more information). Index values refer to char code units,
so a supplementary character uses two positions in a String."
 
以下为相关的测试代码(csdn对特殊字符有限制,所以采用了图片格式):



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值