Java 字符集与编码

读《Java 特种兵》总结之前不会的相关知识。

Java 中的 char 是 UTF-16 编码,每个字符占两个字节的宽度。

例如发送 2 个汉字,用 UTF-8 编码发送后会占用 6 个字节,对方若知道传来的数据是 UTF-8 编码,便知道这 6 个字节代表哪 2 个汉字,就自然能得到正确的 char 字符了。但是如果对方用 GBK 来编码,则可能会认为有 3 个字符,若按照每 2 个字节计算 1 个字符,得到的 3 个字符自然不是需要传递的 2 个汉字字符。假如此时意识到自己的编码错误了,通过得到的 3 个字符的字符串调用 getBytes(“GBK”) 还可以还原 6 个字节,然后通过这 6 个字节再用 new String(byte[], “UTF-8”) 得到实际的 2 个汉字。可真的是这样嘛?要知道这是偶然的,不是必然的,因为 UTF-8 转换出来的 6 个字节,当按照每 2 个字节组成编码时,这个编码未必在 GBK 的编码范围内,若不在 GBK 的编码范围内,就可能会用一个 “?” 或其他字符来代表,由于 “?” 本身也是一个字符,当再次调用 getBytes(“GBK”) 时得到的对应字节就是 “?” 对应的字节,而不是原来字符的字节,有可能都不再是 6 个字节了。换句话说,这样的情况是永远无法转换回来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值