Java中的char究竟能存中文吗?

Posted hephae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的char究竟能存中文吗?相关的知识,希望对你有一定的参考价值。

今天面试被问到“Java中的char能存中文吗?”,我回答有的字能有的字不能,结果被嘲笑了,不过我也忘了字符编码的相关知识所以也没能解释。晚上查了下资料,记录一下。

网上搜索这个问题,答案清一色都是能,毕竟随便写行代码都能清晰地证明可以:

char c = \'我\';

但是事实并不是那么简单,Java的char内部编码为UTF-16,请参考String编码(二) 证明JAVA的char编码为UTF-16

Java 的char用两字节存储,表示范围从 \'\\u0000\' 到 \'\\uffff\' ,也就是从0到65535。事实上,一个 char不能表示65535个字符,因为只有U+0000 到 U+D7FF 和 U+E000 到U+FFFF能用来表示 一个完整的字符,这些叫做 BMP,另外的作为high surrogate和 low surrogate 拼接组成由4字节表 示的字符。

在UTF-16编码中,大于U+10000码位将被编码为一对16比特长的码元,即按4个字节编码,此时char无法表示。utf16编码格式

所以Java的char只能表示utf­16中的bmp部分字符。对于CJK(中日韩统一表意文字)部分扩展字符集则无法表示。

 例如,下图中除Ext-A部分,char均无法表示。

 

以上是关于Java中的char究竟能存中文吗?的主要内容,如果未能解决你的问题,请参考以下文章

springboot stringredistemplate 能存对象吗

C- 中的字符串是 char *str 真的等价于 char str [] 吗? [复制]

Java语言中的字符char可以存储一个中文汉字吗为什么呢

片段着色器究竟如何用于纹理?

(转) Java中的负数及基本类型的转型详解

LockSupport.java 中的 FIFO 互斥代码片段