java char 只有两个字节, 怎么装下9万多汉字?

2021-01-09 08:32

阅读:414

标签:细节   效率   str   http   面试   nsf   block   cte   用两个   

背景

面试问起 java char 怎么存储中文,只知道 Unicode。本文挖一下细节。

Unicode

Universal Character Set,缩写 UCS,俗称 Unicode,是ISO制定的字符集,包含世界上所有文字和符号。
Unicode字符分为17组,每组65536个,总共1114112个。第1组称为BMP,其余16组称为SP。

代码点(Code Point) 俗称“码点”,是 Unicode 代码空间中的一个值,代表一个字符,比如 “知” 对应码点 U+77E5。

UTF

UCS Transformation Format,缩写 UTF,俗称“编码规则”。
UTF 有3套方案,区别在于存储空间、编码效率的取向:
UTF-8 变长8位。用8位的倍数位来表示一个字符,可以是8位、16位、24位、32位(4个字节),取向存储空间;
UTF-16 变长16位,可以是16位、32位。存储空间、编码效率的折中,是 java 默认编码规则;
UTF-32 定长32位,可以表示 16777216 个字符,远超 Unicode 1114112 个,取向编码效率。

代码单元(Code Unit) 在具体编码形式中的最小单位。比如 UTF-16 中一个代码单元为 16 bits,UTF-8 中一个代码单元为 8 bits。

char 装不下怎么办

char 真实的含义是描述了UTF-16编码中的一个代码单元,而不是一个字符。
当字符用 UTF-16 编码后,一个 char 存不下,那就只能使用两个char来表示一个字符。
其中 U+D800 ~ U+DBFF 用于第一个代码单元,U+DC00 ~ U+DFFF 用于第二个代码单元。
这样java也可以很迅速的知道这个char是代表一个字符的编码,还是一个字符的第一部分或者第二部分。对于需要用两个char来表示的字符,单拿出任何一个char来看都是没有意义的,他们也不会映射任何Unicode的字符集,属于保留的空闲区域。当然也正是这样保留区域的设计才使得变长编码变得可能。

结论

一个 char 肯定只有2个字节,但一个字符可能有2个或4个字节。

Reference

  • UTF-16是固定两个字节长度吗?
  • 深入分析 Java 中的中文编码问题

java char 只有两个字节, 怎么装下9万多汉字?

标签:细节   效率   str   http   面试   nsf   block   cte   用两个   

原文地址:https://www.cnblogs.com/mougg/p/12961945.html


评论


亲,登录后才可以留言!