Java中英文和中文字符分别占用多少字节?

5
import java.io.UnsupportedEncodingException;

public class TestChar {

    public static void main(String[] args) throws UnsupportedEncodingException {
        String cnStr = "龙";
        String enStr = "a";
        byte[] cnBytes = cnStr.getBytes("UTF-8");
        byte[] enBytes = enStr.getBytes("UTF-8");

        System.out.println("bytes size of Chinese:" + cnBytes.length);
        System.out.println("bytes size of English:" + enBytes.length);

        //  in java, char takes two bytes, the question is: 
        char cnc = '龙'; // will '龙‘ take two or three bytes ?
        char enc = 'a'; // will 'a' take one or two bytes ?
    }
}

输出

   bytes size of Chinese:3

   bytes size of English:1

在这里,我的JVM设置为UTF-8,从输出结果可以知道,汉字“龙”需要3个字节,而英文字母“a”只需要1个字节。那么我的问题是:

在Java中,char类型占用2个字节。那么在这里,定义char变量cnc='龙'和enc='a'时,cnc只占用了2个字节而不是3个字节吗?而‘a’是否占用了2个字节而不是1个字节?

3个回答

4
的代码点值为 40857,可以放入 char 类型的两个字节中。
在 UTF-8 编码中,需要占用 3 个字节进行编码,因为并非所有的 2 字节序列都是有效的。

3

UTF-8 是一种可变长度的字符编码格式,其中字符占用1到4个字节。

在Java中,char类型占用16位。请参阅Java语言规范中的第3.1节Unicode以了解Java如何处理Unicode。


1

在内部,字符串/字符采用UTF-16编码,因此对于两者来说都是相同的:每个字符将占据16位。

byte[] cnBytes = cnStr.getBytes("UTF-8");

UTF-8是一种可变长度编码,因此中文字符需要更多的位数,因为它超出了ASCII字符范围。


1
在最近的版本中,如果字符串中的所有字符都是Latin-1,则Java可以将它们内部存储为每个字符一个字节,但这与本问题并不相关。char仍然始终是16位。 - David Conrad
不错,我不知道这个!听起来像是昔日的速度技巧“-XX:UseCompressedStrings”。 - Jonathan S. Fisher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接