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编码的。

代码证明如下:

分析:

如上图,字符串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数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容