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

时间:2018-09-05 04:51:54

标签: java string encoding character-encoding byte

我的行为异常,我想知道这是否是预期行为,其背后的原因是什么?我使用字节数组创建了一个新的String,当我使用相同的编码取回字节数组时,字节数组就不同了。

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 个答案:

答案 0 :(得分:2)

并非每个随机字节数组都是有效的UTF-8。实际上,我会说很少。因此,在创建字符串时,您会将某些字符转换为U + FFFD,这表明在确定原始字节时存在错误。这样,当转换回字节时,这些看上去当然会有所不同。

如果您想进行一次干净的往返,请不要在其中放入无效的数据。或者您可以使用类似Latin-1的编码来代替,其中每个字节都是有效的,因此保持不变。但是通常将不是文本的随机数据放在字符串中很少有用或好主意。在二进制数据和文本之间没有区别的地方,这不是C。

答案 1 :(得分:2)

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

  

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

这意味着输入的字节(如果无效)不一定与输出的字节相同;即使使用相同的Charset