代码之家  ›  专栏  ›  技术社区  ›  dukyz

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

  •  2
  • dukyz  · 技术社区  · 6 年前

    我对Java字符串的解码和编码感到困惑。

    现在我有一个字符串变量“”,在中文中表示中国,它包含在中文原生字符集GB2312中,也包含在Unicode中。

    那么以下两者之间的区别是什么呢??

    val f = "中国"
    
    println(new String(f.getBytes("GB2312"),"GB2312"))
    
    println(new String((new  String(f.getBytes("GB2312"),"UTF8")).getBytes("UTF8"),"GB2312") ) 
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Diasiare    6 年前

    它的行为是这样的,因为 new String(x, "UTF8").getBytes("UTF8") 只会是 x 如果 十、 实际上是UTF-8字符串的有效字节表示形式。否则根据 javadoc for String

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

    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 的开头)。看见 Wikipedia 有关UTF-8格式的更多详细信息。

        2
  •  0
  •   Tom Blodget    6 年前

    仅仅 new String(s.getBytes("UTF8"),"GB2312") ) 不会做你认为它会做的事。(我不知道你认为它有什么作用,但我认为它不会带来任何好处。)

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