JavaでBOM付きUTF-8を扱う
最近、BOM(Byte Order Mark)付きUTF-8で記述されたファイルをJavaで扱うことがあって気づいたのだけれども、JavaってUTF-8のBOMを読み飛ばしてくれないのな。で、ちょっと検索したらSDN(Sun Developer Network) の Bug Database に該当記述があった。
- Bug ID: 4508058 UTF-8 encoding does not recognize initial BOM
- Bug ID: 6378911 UTF-8 decoder handling of byte-order mark has changed
面倒なのできちんと読んでいないのだけども、Mustangで一度BOM付きUTF-8をきちんと扱えるようにしたけど、互換性の問題から元に戻されてて、これからも修正されることはないってことでいいのかな。
なんだそれ。ちくしょうめ。
なんか、コメント読むと jEdit は UTF-8Y なんてのを用意してAPI側で吸収しているらしいのだが、そういうのを Java API 側で追加するとかできないのかな。
とりあえずの次善策としては以下みたいな感じ。面倒だ。
InputStream fin = null;
Reader in = null;
try {
fin = new FileInputStream(file);
in = new InputStreamReader(fin, "UTF-8");
StringBuilder buffer = new StringBuilder();
int c;
c = in.read();
if (c != -1) {
if (c != 0xFEFF) { buffer.append((char) c); }
while ((c = in.read()) != -1) { buffer.append((char) c); }
}
} finally {
if (in != null) {
in.close();
} else if (fin != null) {
fin.close();
}
}