论坛首页 Java企业应用论坛

关于Java中的编码

浏览 1334 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-26   最后修改:2011-04-26
编码转换,实际就是把byte数组转换为char数组的过程,或者是其逆过程
在Java中,前者通过new String(byte[], Charset) -> StringCoding.decode,
后者通过getBytes(Charset) -> StringCoding.encode
在encode和decode时,默认会采用Charset.defaultCharset(),jvm一般是utf-8。如果无法取得,则会使用iso-8859-1,如果仍无法取得,则System.exit(1);

问题1:在utf-8下,每个字符可以是1-6个字节不等,但是jvm中char是固定2个字节的,那么char如何表示字符呢?

首先澄清一个典型的错误就是认为string是存在某种编码绑定的。string对象建立后,内部持有名为value的char数组,这里char表示了逻辑意义上的字符,而byte没有逻辑意义,只有物理存储意义。凡是char在java中统一都会由utf16来表示。从这个意义上讲,可以说string就是utf16编码的,同时也可以说是不针对任何编码的。可以通过getbytes获得任何编码的二进制表示。这个概念和Date相对于各个时区是类似的。

问题2:2个字节是2^16=65536,没有办法覆盖到全部字符,如何给unicode32的字符集找到默认的char表示?

这个问题我可能多虑了,jvm和windows都按照utf16设计,其中涵盖的汉字是2w多个。对于扩充的东亚字符,oracle也给出了方案,文章说得比较详细,就不赘述了:
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/
另外java.lang.Character中也有说明
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics