从无效(字符集)字节[]转换时Java字符串的行为(安全)?

从无效(字符集)字节[]转换时Java字符串的行为(安全)?,java,string,Java,String,通过构造函数将包含随机二进制数据的字节[]转换为字符串是否100%安全(无异常/错误): new String(bytes); // -- or -- new String(bytes,"UTF-8"); // Or other charset 我关心的是无效的UTF-8字节是否会导致异常或其他故障,而不仅仅是一条可能部分被篡改的消息 我尝试了一些已知的坏字节值,因为它们看起来像预期的那样工作。例如: byte[] bytes = new byte[] {'a','b','c',(byte)

通过构造函数将包含随机二进制数据的字节[]转换为字符串是否100%安全(无异常/错误):

new String(bytes);
// -- or --
new String(bytes,"UTF-8");  // Or other charset
我关心的是无效的UTF-8字节是否会导致异常或其他故障,而不仅仅是一条可能部分被篡改的消息

我尝试了一些已知的坏字节值,因为它们看起来像预期的那样工作。例如:

byte[] bytes = new byte[] {'a','b','c',(byte)0xfe,(byte)0xfe,(byte)0xff,(byte)0xff,'d','e','f'};

String test = new String(bytes,"UTF-8");

System.out.println(test);
打印“abc???def”

我担心的是,由于我不能保证可以测试每个无效的组合,因此某些其他组合是否会以其他意外方式失败。

这在以下内容中有介绍:

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

如果您不总是使用UTF-8,那么有一件事会失败,那就是它可能会抛出。

这将在以下内容中介绍:

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


如果您不总是使用UTF-8,那么有一件事会失败,那就是它可能会抛出错误。

如果您想在错误输入上处理解码行为,请使用

StandardCharsets.UTF_8
  .newDecoder()
  .implOnMalformedInput(CodingErrorAction.REPORT)
  .implOnUnmappableCharacter(CodingErrorAction.REPLACE)
  .implReplaceWith(replacementString)
  .decode(ByteBuffer.wrap(byteArray))
  .toString();

它可以让你旋转所有相关的旋钮。

如果你想旋转坏输入的解码行为,可以使用

StandardCharsets.UTF_8
  .newDecoder()
  .implOnMalformedInput(CodingErrorAction.REPORT)
  .implOnUnmappableCharacter(CodingErrorAction.REPLACE)
  .implReplaceWith(replacementString)
  .decode(ByteBuffer.wrap(byteArray))
  .toString();

它可以让你旋转所有涉及的旋钮。

要确保“垃圾”不仅仅是有效字节序列的原始输入,真的没有简单的方法。。如果源是可疑的,则使用校验和或其他验证方法对其进行框显。尽管它确实提出了一个问题:Java中的字符串解码有多严格?确实没有简单的方法来确保“垃圾”不仅仅是有效字节序列的原始输入。。如果源是可疑的,则使用校验和或其他验证方法对其进行框显。尽管它确实提出了一个问题:Java中的字符串解码有多严格?是否有一种方法会对格式错误的输入/不可映射字符引发异常?引用您链接的文档:“当给定字节在给定字符集中无效时,此构造函数的行为未指定。”@pst否它们被默认替换,通常是
。没有方法会引发异常,因为没有留下任何格式错误的输入。如果您的意思是构造函数,那么“是”将在给定非法代码点时抛出
IllegalArgumentException
。@parsifal请使用
字符集更新您的响应,以显式声明。已被接受并投票,但veer是正确的,对于阅读本文的其他人来说,指出您的评论是指
字符串(字节,字符集)
而不是
字符串(字节)
。是否有一种方法会对格式错误的输入/不可复制的字符引发异常?引用您链接的文档:“当给定字节在给定字符集中无效时,此构造函数的行为未指定。“@pst no它们被默认替换,通常是
。没有方法会引发异常,因为没有留下任何格式错误的输入。如果您的意思是构造函数,那么“是”将在给定非法代码点时抛出
IllegalArgumentException
。@parsifal请使用
字符集更新您的响应,以显式声明。已被接受并投票,但veer是正确的,对于阅读本文的任何其他人来说,指出您的注释是指
字符串(字节,字符集)
而不是
字符串(字节)
可能会很有用。