浏览 1342 次
锁定老帖子 主题:关于Java中的编码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-26
最后修改:2011-04-26
在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中也有说明 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |