为什么java中的字符串解码和编码并不总是对称的?

时间:2018-04-24 10:19:49

标签: java character-encoding

我对Java String的解码和编码感到困惑。

现在我有一个字符串变量"中国",意思是中文,包含在中文本地字符集GB2312中,也包含在Unicode中。

以下是什么区别??

val f = "中国"

println(new String(f.getBytes("GB2312"),"GB2312"))

println(new String((new  String(f.getBytes("GB2312"),"UTF8")).getBytes("UTF8"),"GB2312") ) 

2 个答案:

答案 0 :(得分:1)

它的行为与此类似,因为new String(x, "UTF8").getBytes("UTF8")的输出只有x,如果x实际上是UTF-8字符串的有效字节表示。否则根据javadoc for String

  

此方法始终使用此charset的默认替换字符串替换格式错误的输入和不可映射字符序列。

UTF-8的默认字符是 (位表示11101111 10111111 10111101)。 f.getBytes("GB2312")返回以下位序列:11010110 11010000 10111001 11111010。与一个无效字符一样,后跟11010000 10111001或©,然后是另一个无效字符。 new String(f.getBytes("GB2312"),"UTF8")的输出因此而被转换为二进制格式11101111 10111111 10111101 11010000 10111001 11101111 10111111 10111101

1101011011111010无效,因为以11xxxxxx形式的字节开头的任何字节序列必须后跟10xxxxxx形式的一个或多个字节(确切的数字取决于第一个数字开头的1的数量。有关UTF-8格式的详细信息,请参阅Wikipedia

答案 1 :(得分:0)

简单地说,new String(s.getBytes("UTF8"),"GB2312") )并没有按照您的想法行事。 (我不知道你认为它做了什么,但没有任何好处可以来自它,所以我假设。)

这意味着:使用UTF-8对字符串中的文本进行编码,然后获取这些字节并对其进行解码,就好像它们是使用GB2313进行文本编码一样。