代码之家  ›  专栏  ›  技术社区  ›  Nicolas Henneaux

在创建字符串和getBytes()之间转换字符串的字节

  •  1
  • Nicolas Henneaux  · 技术社区  · 6 年前

    我有一个意想不到的行为,我想知道这是否是预期的行为和背后的原因是什么?我使用字节数组创建一个新字符串,当我使用相同的编码返回字节数组时,字节数组就不一样了。

    byte[] bytes = new byte[24];
    new Random().nextBytes(bytes);
    assertEquals( // fails
      DatatypeConverter.printHexBinary(bytes), 
      DatatypeConverter.printHexBinary(new String(bytes, UTF_8).getBytes(UTF_8))
    );
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Joey Gumbo    6 年前

    不是每个随机字节数组都是有效的UTF-8。事实上,我想说他们中很少有人是。因此,在创建字符串时,会将一些字符转换为U+FFFD,这表示在确定原始字节时出错。当转换回字节时,它们看起来当然会有所不同。

        2
  •  2
  •   Slaw    6 年前

    您正在使用随机生成的字节来创建 String . 无法保证这些随机生成的字节是有效的UTF-8(或任何编码)。如果你看一下 String(byte[],Charset) 您将看到:

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

    Charset .