Java程序员遇上字符乱码9-你理解“java中字符都是unicode编码”的含义?

我们经常从书本上看到“java中字符都是unicode编码”。可是我们从没有看到过“java中字符都是UTF-8编码”这种说法。

这是因为,JVM(即java程序跑起来)中的char字符是“只有编码而没有编码格式的”。“编码格式”是当 我们需要将之存储到硬盘或网络传输时才考虑的。详解《Java程序员遇上字符乱码7-说说常见字符集Unicode》。JVM中的char字符 是Unicode字符集的原生的索引序号。

我们在字符转码时往往会使用 String.getBytes("CharsetName"),得到的字节数组则是 底层工具根据 CharsetName 将 对应String中的Unicode字符数组元素逐一格式化 后return给我们。有兴趣可以断点:java.lang.StringCoding.StringEncoder#encode 可以知道。

另外,String rs = new String(byte_gbk_array , "GBK") 得到rs,我们往往容易以为它是 GBK格式的。然而,你错了。rs中的每一个字符,都依然还是 Unicode !!!!其实,这行代码的意思应该这样理解:"我们已知byte_gbk_array  是GBK格式的字节数组,现在通过String的一个构造函数将 此GBK数组  逆运算 恢复到Unicode字符串rs" 。

如何证实“Java中的字符都是Unicode编码的”?

由上,我们知道,其实这句话应该这样子说:java运行起来后(即JVM内存中)的char字符都是Unicode编码的。

代码证明如下:

Java程序员遇上字符乱码9-你理解“java中字符都是unicode编码”的含义?_第1张图片

分析:

如上图,字符串ni_new_gbk中的char数组元素和字符串ni_new_utf8 中的char数组元素都是 0x4f60(即十进制:20320 ),都是Unicode字符集中 '你' 的码。这里一定要注意:很容易误认为字符串ni_new_gbk 中的char数组元素 是gbk编码的(0xC4E3)。

那么其实 str.getBytes("gbk") , 其实都是unicode编码的字符数组元素 分别转化成 gbk编码格式的字节 然后统一存放到一个字节数组返回给我们。

注意:String是一个对象,所以不可以说“Java中的字符串都是Unicode编码的”,虽然String本质是个 由Unicode编码的char组成的char数组。

你可能感兴趣的:(Java程序员遇上字符乱码9-你理解“java中字符都是unicode编码”的含义?)