读《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 个字节了。换句话说,这样的情况是永远无法转换回来的。