我对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") )
答案 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
。
11010110
和11111010
无效,因为以11xxxxxx
形式的字节开头的任何字节序列必须后跟10xxxxxx
形式的一个或多个字节(确切的数字取决于第一个数字开头的1
的数量。有关UTF-8格式的详细信息,请参阅Wikipedia。
答案 1 :(得分:0)
简单地说,new String(s.getBytes("UTF8"),"GB2312") )
并没有按照您的想法行事。 (我不知道你认为它做了什么,但没有任何好处可以来自它,所以我假设。)
这意味着:使用UTF-8对字符串中的文本进行编码,然后获取这些字节并对其进行解码,就好像它们是使用GB2313进行文本编码一样。