4

簡単な Java プログラムでいくつかの txt ファイルを処理していましたが、プロセスの最初のステップは、各ファイルの行を数えることです。

int count = 0;
br = new BufferedReader(new FileReader(myFile)); // myFile is the txt file in question
while (br.readLine() != null) {
    count++;
}

私のファイルの 1 つで、Java は実際の行数のちょうど 2 倍をカウントしていました。これは最初、私を大いに混乱させました。各ファイルを Notepad++ で開いたところ、ミス カウント ファイルが、CR と LF を使用して、他のファイルとまったく同じようにすべての行で終わっていることがわかりました。もう少し調べてみると、すべての「OK」ファイルが ANSI エンコードされており、1 つの問題ファイルが UCS-2 リトル エンディアン (これについては何も知りません) としてエンコードされていることに気付きました。これらのファイルを別の場所で入手したので、なぜそのようにエンコードされたのかわかりませんが、もちろん ANSI に切り替えると問題が解決しました。

しかし今、好奇心は残っています。エンコーディングが原因で行数が 2 回報告されるのはなぜですか?

ありがとう!

4

2 に答える 2

10

簡単: UCS-2 (または UTF-16) テキストを読み取るときに間違ったエンコーディングを適用すると (例: ANSI、または任意の 8 ビット エンコーディング)、1 文字おきに 0x0 になります。これにより、CR-LF が CR-0-LF に分割されます。これは、2 つの行の変更 (CR 用に 1 つ、LF 用に 1 つ) と見なされます。

于 2012-04-09T08:01:29.310 に答える