发现依赖于默认编码

Sri*_*san 51 findbugs

我正在从FindBugs获得以下bug,

发现依赖于MyClass.print(String)中的默认编码:String.getBytes()

方法

protected void print (String str) {
{
private OutputStream outStream = null;
.....
outStream.write(str.getBytes());
.......
}
Run Code Online (Sandbox Code Playgroud)

请告诉我这是什么错误?我们如何解决这个问题?

提前致谢

Tim*_*imK 90

将字符串编码为字节有不同的方法 - 字符集确定编码.如果未指定charset,就像调用str.getBytes()一样,它使用系统默认值.

FindBugs会警告您这一点,因为您应该考虑要用于输出的编码.如果你正在写一个文件,那个文件的读者会期待什么?如果您可以为文件指定显式编码是最安全的,那么您不能以一种方式编写它并以另一种方式读取它.

例如,要指定显式字符集,请使用str.getBytes().UTF-8是一个不错的选择,因为它始终受支持并且可以编码任何字符.

例如,.properties文件始终是ISO 8859-1(即Latin-1).这是记录在案的,所以使用什么编码没有歧义.

  • 作为`Charset.forName("UFT-8")的替代,`Java 7定义了`StandardCharsets.UTF_8`.请参见http://stackoverflow.com/a/16066990/152061 (13认同)
  • 如果您有相反的情况(bytes - > string,而不是string - > bytes),请使用`new String(bytes,StandardCharsets.UTF_8);`而不是`new String(bytes);` (4认同)