Java中char类型占几个字节?

要想弄清楚char占用几个字节,就必须了解Unicode编码机制。
早在Unicode诞生之前,就已经有很多字符集,如美国的ASCII、表示西欧语言的ISO 8859-1、中国的GB18030等。
但是世界上始终没有一种字符集,容纳了全世界所有的语言,这就产生了一个问题:如果你有一个里面用十几种不同语言写的内容,没有一种字符集能够完全正确显示这个文件。
Unicode编码的目的就是要解决这个问题。
一开始设计Unicode编码只有2字节,因为当时认为认为两字节的代码宽度足以对世界上各种语言的所有字符进行编码。并有足够的空间留给未来扩展。然后不幸的是,在引入大量汉语、日语和韩语的表意文字后,Unicode字符超过了65536个,两个字节已经完全不够用!
如何解决这个问题呢?
我们先了解一个概念:**码点(code point)是指一个编码表中某个字符对应的代码值。**如在ASCII表中a的码点是97。在Unicode中,码点用十六进制表示,使用UTF-16编码。

Unicode的码点分为17个代码级别,第一个级别称为基本的多语言级别,使用一个代码单元进行编码表示,其余的16个级别使用一对连续的代码单元表示。而代码单元是UTF-16的编码单位,一个是16位,也就是2字节。简而言之就是有的Unicode的码点是需要两个字节来表示,有的需要四个字节。后者表示的字符被称为辅助字符
那么当计算机进行编码的时候,每读取两个字节(一个代码单元),这两个字节代表的是一个需要两字节表示的码点,还是一个需要四字节表示的码点的一部分呢?
Unicode规定,第一级别的码点从U+0000到U+FFFF,而辅助字符的码点范围是U+10000到U+10FFFF。也就是说,当读取到两个字节,如果这两字节在U+0000到U+FFFF那么可以直接编码成一个字符,而如果在后者,则代表这两字字节只是辅助字符的第一或第二部分,还需要与另外的两个字节组合,才是一个完整的字符。
而在Java中**,char类型描述了UTF-16编码中的一个代码单元(2字节)**。
所以强烈建议不要再程序中使用char类型,除非确实需要处理UTF-16代码单元。涉及到字符,最好使用String。

参考:Java核心技术卷Ⅰ第10版

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值