1. ホーム
  2. findbugs

[解決済み] デフォルトのエンコードに依存していることが判明

2022-02-09 18:57:03

質問

FindBugsから以下のバグを取得しました。

MyClass.print(String) でデフォルトエンコーディングへの依存を発見しました。String.getBytes()

メソッド

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

どのようなエラーなのか、どのように解決すればいいのか、教えてください。

ありがとうございました。

解決方法は?

文字列をバイトとしてエンコードする方法はさまざまで、charsetがそのエンコードを決定します。 charset を指定しない場合、たとえば以下のようになります。 str.getBytes() の場合、システムのデフォルトが使用されます。

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

明示的に文字セットを指定するには str.getBytes(Charset.forName("UTF-8")) といった具合です。 UTF-8は常にサポートされており、あらゆる文字をエンコードできるため、良い選択です。

例えば .properties ファイルは常にISO 8859-1 (すなわちLatin-1)です。 これは、どのエンコーディングを使用するかについて曖昧さがないように文書化されています。