java char 只有两个字节, 怎么装下9万多汉字?
2021-01-09 08:32
标签:细节 效率 str http 面试 nsf block cte 用两个 面试问起 java char 怎么存储中文,只知道 Unicode。本文挖一下细节。 Universal Character Set,缩写 UCS,俗称 Unicode,是ISO制定的字符集,包含世界上所有文字和符号。 代码点(Code Point) 俗称“码点”,是 Unicode 代码空间中的一个值,代表一个字符,比如 “知” 对应码点 U+77E5。 UCS Transformation Format,缩写 UTF,俗称“编码规则”。 代码单元(Code Unit) 在具体编码形式中的最小单位。比如 UTF-16 中一个代码单元为 16 bits,UTF-8 中一个代码单元为 8 bits。 char 真实的含义是描述了UTF-16编码中的一个代码单元,而不是一个字符。 一个 char 肯定只有2个字节,但一个字符可能有2个或4个字节。 java char 只有两个字节, 怎么装下9万多汉字? 标签:细节 效率 str http 面试 nsf block cte 用两个 原文地址:https://www.cnblogs.com/mougg/p/12961945.html背景
Unicode
Unicode字符分为17组,每组65536个,总共1114112个。第1组称为BMP,其余16组称为SP。
UTF
UTF 有3套方案,区别在于存储空间、编码效率的取向:
UTF-8 变长8位。用8位的倍数位来表示一个字符,可以是8位、16位、24位、32位(4个字节),取向存储空间;
UTF-16 变长16位,可以是16位、32位。存储空间、编码效率的折中,是 java 默认编码规则;
UTF-32 定长32位,可以表示 16777216 个字符,远超 Unicode 1114112 个,取向编码效率。
char 装不下怎么办
当字符用 UTF-16 编码后,一个 char 存不下,那就只能使用两个char来表示一个字符。
其中 U+D800 ~ U+DBFF 用于第一个代码单元,U+DC00 ~ U+DFFF 用于第二个代码单元。
这样java也可以很迅速的知道这个char是代表一个字符的编码,还是一个字符的第一部分或者第二部分。对于需要用两个char来表示的字符,单拿出任何一个char来看都是没有意义的,他们也不会映射任何Unicode的字符集,属于保留的空闲区域。当然也正是这样保留区域的设计才使得变长编码变得可能。结论
Reference
文章标题:java char 只有两个字节, 怎么装下9万多汉字?
文章链接:http://soscw.com/index.php/essay/41128.html