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

摘要:
系统出来println(“word”.getBytes()。长度);我们如何使用char类型的变量来表示它?在Java中,字符类型不是两个字节吗?Java中有外来代码和内部代码。“外来代码是JVM外部使用的代码。一个汉字可以用1-3个字节表示,这是一个固定长度的代码。所有字符都用两个字节表示。您可以看到String的源代码实现。

  比如这断程序:

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(两个字节)表示一个中文字符》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇静默是最终极,也是最好的老师delphi的Public,Private,Protected,Published作用域【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle中的next_day(date,char)函数的理解

该方法结果是指定日期date之后的下一个周char指定天的日期,char可以表示为星期或者天数。 一:char为星期 结果是指定日期date之后的下一个周char指定天的日期 1 SQL> select to_char(sysdate,'yyyy-mm-dd/day') from dual; 2 2019-07-10/星期三 3 4 SQ...

大端模式和小端模式

参考资料 维基百科:http://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F 百度百科:http://baike.baidu.com/link?url=J5-a6IjSYnxbQyjjkid51Zr6YivgbYZM0z2sWNBsCMbc1E3wv2ACH6HlxTjY7RGDz3qeFoTRl21...

String与byte[]字节数组中文转换乱码问题

  Sunshine的 String.getBytes()和new String()  在Java中,String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如 byte[] b_gbk = "中".getBytes("GBK"); byte[] b_utf8 = "中".get...

C# String 前面不足位数补零的方法

int i=10;方法1:Console.WriteLine(i.ToString("D5"));方法2:Console.WriteLine(i.ToString().PadLeft(5,'0'));//推荐方法3:Console.WriteLine(i.ToString("00000")); 在 C# 中可以对字符串使用 PadLeft 和 PadRi...

JSP,servlet和数据库之间传值出现乱码的问题

 近期困扰我非常久的一个问题最终攻克了,为他我头疼了好几天,问题是JSP通过servlet向数据库传值,查询显示在页面的时候出现了乱码,原先我数据库中有两行带有中文的数据,查询的时候倒是没有出现乱码。我debug一下。发现JSP和servlet中全部接受中文字符集的变量都没有出现乱码,我去数据库查看。全部加入的中文字符都是问号,问题发现了,我就百度什...

IOS 原生解析JSON 问题

服务器----WebService 返回的是JSON数据 IOS解析报错: Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 56." UserInfo={NSDebugDescription=Unable to conv...