web-dev-qa-db-ja.com

デフォルトのエンコーディングへの依存が見つかりました

FindBugsからバグを取得しています。

MyClass.print(String):String.getBytes()でデフォルトのエンコーディングへの依存が見つかりました

メソッド

protected void print (String str) {
{
private OutputStream outStream = null;
.....
outStream.write(str.getBytes());
.......
}

エラーを教えてください。どうすれば解決できますか?

前もって感謝します

49
Srinivasan

文字列をバイトとしてエンコードするにはさまざまな方法があります。文字セットはそのエンコードを決定します。 str.getBytes()への呼び出しのように文字セットを指定しない場合、システムのデフォルトが使用されます。

FindBugsはこのことについて警告しています。出力に使用するエンコーディングを検討する必要があるためです。ファイルに書き込む場合、そのファイルの読者は何を期待していますか?ファイルに明示的なエンコーディングを指定して、ある方法で書き込み、別の方法で読み取らないようにすることができれば、最も安全です。

明示的な文字セットを指定するには、たとえばstr.getBytes(Charset.forName("UTF-8"))を使用します。 UTF-8は常にサポートされており、任意の文字をエンコードできるため、適切な選択です。

例えば、 .propertiesファイルは常にISO 8859-1(つまりLatin-1)です。それは文書化されているので、どのエンコーディングを使用するかについてあいまいさはありません。

87
TimK