关于Java中的编码

编码转换,实际就是把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中也有说明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值