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(); } }