Java中为什么可以用一个char(两个字节)表示一个中文字符

Posted reupe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中为什么可以用一个char(两个字节)表示一个中文字符相关的知识,希望对你有一定的参考价值。

  比如这断程序:

char word = ‘字‘;
System.out.println("字".getBytes().length);       // 输出为 3

 

其输出结果为3, 小伙伴们就要问了:“奇怪了,‘字‘这个字符,明明是三个字节,怎么可以用char类型的变量来表示? char类型不是在java中是两个字节么?”

 

  其实,java中有外码和内码之分,顾名思义,外码就是JVM外部使用的编码,比如你在编辑器中输入的“字”,假设是UTF-8编码,UTF-8是变长编码,一个中文可能是1-3个字节来表示;那么,在JVM中,用的都是Unicode码,这是定长编码,所有字符都统一使用两个字节表示,这就是Java的内码。

 

  "字".getBytes()   JVM执行这段逻辑,实际是进行了编码转换的,可以看String的源码实现:

public byte[] getBytes() {
    return StringCoding.encode(value, 0, value.length);    // 调用StringCoding.encode()      
}
static byte[] encode(char[] ca, int off, int len) {
        String csn = Charset.defaultCharset().name();      // 这里,Charset.defaultCharset()默认是UTF-8
        try {
            // use charset name encode() variant which provides caching.
            return encode(csn, ca, off, len);
        } catch (UnsupportedEncodingException x) {
            warnUnsupportedCharset(csn);
        }

 

可以看到,Java把字符串"字"(字符串就是char的数组), 编码为UTF-8 , 转为UTF-8的“字”, 它的长度就变成了3个字节哦。

 

以上是关于Java中为什么可以用一个char(两个字节)表示一个中文字符的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中将 char 表示为一个字节

char型变量中能不能存储一个中文汉字,为什么?

java的char类型,只有两个字节,为什么可以存储汉字?java中 char详解

java数据类型

C语言,char字符型的取值范围是0-255,表示的是只有255字符(难道计算机只有255个字符吗)

java 详细介绍short,byte,char三种类型,我分不清