【Java面经整理】char可以存汉字吗,底层是怎么存的——char类型详解

ps:Java面试题整理专栏,专门收集整理搬运面试题和答案

char可以存汉字吗,底层怎么存的

char是按照字符存储的,不管英文还是中文,固定占用占用2个字节(16位),用来储存Unicode字符。范围在0-65536。
unicode编码字符集中包含了汉字,所以,char型变量中是可以存储汉字的。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。

以下部分内容来自《Java核心技术 卷I》

char:

char类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000(即为0);
最大值是 \Uffff(即为65,535);
char 数据类型可以储存任何字符;
例子:char letter = ‘A’;。

,char 类型的值可以表示为十六进制值,其 范围从 \u0000 到 \Uffff。
例如:\u2122 表示符号 ™, \u03C0 表示希腊字母 it,\u6211\u7231\u4f60表示字符串“我爱你”
在这里插入图片描述
除了转义序列 \u之外, 还有一些用于表示特殊字符的转义序列, 请参看表 3-3。所有这 些转义序列都可以出现在加引号的字符字面量或字符串中。例如,’\u2122’或"Hello\n”。转义序列 \u还可以出现在加引号的字符常量或字符串之外(而其他所有转义序列不可以) 。
例 如:

  public static void main(String\u005B\u00SD args)

就完全符合语法规则, \u005B 和 \u005D 是 [ 和 ] 的编码。

表 3-3 特殊字符的转义序列

转义序列 名称 Unicode值
\b 退格 \u0008
\t 制表 \u0009
\n 换行 \u000a
\r 回车 \u000d
\ " 双引号 \u0022
单引号 \u0027
\ 反斜杠 \u005c

警告: Unicode 转义序列会在解析代码之前得到处理。 例如,"\u0022+\u0022”并不是一 个由引号(U+0022) 包围加号构成的字符串。 实际上, \u0022 会在解析之前转换为 ", 这 会 得 到 ""+"" ,
也 就 是 一 个 空 串。


Unicode 和 char 类型

要想弄清 char 类型, 就必须了解 Unicode 编码机制。Unicode 打破了传统字符编码机制 的限制。在 Unicode 出现之前, 已经有许多种不同的标准:美国的 ASCII、 西欧语言中的 ISO 8859-1 俄罗斯的 KOI-8、 中国的 GB 18030 和 BIG-5 等。这样就产生了下面两个问题: 一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是采用大字 符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码, 而另一些字符 则需要两个或更多个字节。
设计 Unicode 编码的目的就是要解决这些问题。在 20世纪 80 年代开始启动设计工作时, 人们认为两个字节的代码宽度足以对世界上各种语言的所有字符进行编码, 并有足够的空间 留给未来的扩展。在 1991 年发布了 Unicode 1.0, 当时仅占用 65 536 个代码值中不到一半的 部分。在设计 Java 时决定采用 16 位的 Unicode 字符集,这样会比使用 8 位字符集的程序设 计语言有很大的改进。
十分遗憾, 经过一段时间, 不可避免的事情发生了。Unicode 字符超过了 65 536 个,其 主要原因是增加了大量的汉语、 日语和韩语中的表意文字。现在, 16 位的 char 类型已经不 能满足描述所有 Unicode 字符的需要了。
下面利用一些专用术语解释一下 Java语言解决这个问题的基本方法。从 Java SE 5.0 开 始。码点(code point) 是指与一个编码表中的某个字符对应的代码值。在 Unicode 标准中, 码点采用十六进制书写,并加上前缀 U+, 例如 U+0041 就是拉丁字母 A 的码点。Unicode 的 码点可以分成 17 个代码级别(codeplane)。第一个代码级别称为基本的多语言级别(basic multilingual plane), 码点从 U+0000 到 U+FFFF, 其中包括经典的 Unicode 代码;其余的 16 个级别码点从 U+10000 到 U+10FFFF, 其中包括一些辅助字符(supplementary character)。
UTF-16 编码采用不同长度的编码表示所有 Unicode 码点。在基本的多语言级别中,每个 字符用 16 位表示,通常被称为代码单元(code unit); 而辅助字符采用一对连续的代码单元 进行编码。这样构成的编码值落人基本的多语言级别中空闲的 2048字节内, 通常被称为替 代区域(surrogate area)
【U+D800 ~ U+DBFF 用于第一个代码单元,U+DC00 ~ U+DFFF 用 于第二个代码单元】。这样设计十分巧妙,我们可以从中迅速地知道一个代码单元是一个字 符的编码,还是一个辅助字符的第一或第二部分。例如,⑪是八元数集(http://math.ucr.edu/ home/baez/octonions) 的一个数学符号,码点为 U+1D546, 编码为两个代码单元 U+D835 和 U+DD46。(关于编码算法的具体描述见 http://en.wikipedia.org/wiki/UTF-l6 ) 。
在 Java中,char 类型描述了 UTF-16 编码中的一个代码单元。
我们强烈建议不要在程序中使用 char 类型,除非确实需要处理 UTF-16 代码单元。最好 将字符串作为抽象数据类型处理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章