码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-05-26 01:32:22      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:细节   效率   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

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

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!