从无效(对于charset)byte []转换时Java String的行为(安全性)?

时间:2012-08-28 22:03:21

标签: java string

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

new String(bytes);
// -- or --
new String(bytes,"UTF-8");  // Or other charset

我担心的是,无效的UTF-8字节是否会导致异常或其他故障,而不仅仅是可能部分乱码的消息。

我尝试了一些已知的错误字节值,因为它们似乎按预期工作。 E.g:

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”。

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

2 个答案:

答案 0 :(得分:4)

docs

中介绍了这一点
  

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

如果您不总是使用UTF-8,那么失败的一件事就是它可以抛出UnsupportedEncodingException

答案 1 :(得分:3)

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

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

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