0

エンコーディングに一種の奇妙な問題があります。ファイルを読み書きするJavaプログラムを書いています。読み書きともにuft-8に設定されており、うまく動作しているようです。メモ帳++でファイルを開いて「エンコーディング」を選択すると、必要に応じて「utf-8」に設定されます。問題は、オプション「utf-8 に変換」(notepad++ で) を選択すると、ドキュメントがダーティとしてマークされ、16 進数に切り替えて diff で両方を見ると違いが表示されることです。本当の問題は、2 番目のバージョンが正しく解析されないことです。二重スラッシュ (これはコメントであり、パーサーによって無視されるはずです) で始まる行は、"?//" として解釈されます。誰がこれを引き起こしているのか、それを修正する方法を知っていますか? 複数の種類の utf-8 が存在するのはなぜですか?

4

1 に答える 1

2

正直なところ、Java UTF-8 デコーダーが最初の BOM を透過的に無視しない理由がわかりませんが、残念ながらそうではありません。

The behaviour was reported as a bug almost a decade ago, but Sun decided not to fix it, as the fix may break existing workarounds: Bug 4508058

One possible workaround is to use a PushbackReade, peek at the first character and discard it if it is a BOM:

FileInputStream fis = new FileInputStream("...");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
PushbackReader pr = new PushbackReader(isr);
int c = pr.read();
if(c != 0xFEFF) {
    // not a BOM
    pr.unread(c);
}

// use pr as your reader
于 2012-10-09T13:17:28.870 に答える