私はこれに対する答えを探しました(彼らがそこにいると確信しています)。Javaのあるエンコーディングから別のエンコーディングへの文字列の解釈
したがって、「för」という単語が含まれた巨大なファイルがあります。私はRandomAccessFileを使用しています。なぜなら、どこにあるのか知っていて、そこに到達するためにseek()関数を使用できるからです。
私はそれを見つけたことを知るために、私のプログラムに文字列 "för"があり、それが平等であることを確認します。ここで問題は、私はデバッガを実行し、私が "för"に到達するときに私が比較するものは "för"です。
私のプログラムは "för"を見つけることなく終了します。
これは私が単語を取得するために使用したコードです:
private static String getWord(RandomAccessFile file) throws IOException {
StringBuilder stb = new StringBuilder();
String word;
char c;
c = (char)file.read();
int end;
do {
stb.append(c);
end = file.read();
if(end==-1)
return "-1";
c = (char)end;
} while (c != ' ');
word = stb.toString();
word.trim();
return word;
}
だから基本的に私が最初に '「-characterにファイル内の現在の位置からすべての文字を返します。だから基本的に私は言葉を得るが、以来(char)file.read();バイト(私は思う)を読み、UTF-8 'ö'は2つの文字 'Ã'と '¶'になりますか?
私がUTF-8エンコーディングでファイルを開くと、それは "för"ですが、ISO-8859-15のファイルを同じ場所に開くと、getWordメソッドが返すもの:「för」
は、だから私の質問:私は、「FOR」と「för」で座っているとき
、この問題を解決する方法はありますか? "för"を取得するために "read"fÃr "をUTF-8文字列のように"言っているのと同じですか?
あなたの問題はここです: '(char)file.read()'。 ['read()'](https://docs.oracle.com/javase/8/docs/api/java/io/RandomAccessFile.html#read--)メソッドは 'char'を返しません。 'byte'を返します。 'byte'を' char'にキャストしないでください。 ---なぜあなたは 'RandomAccessFile'を使用していますが、より有用な' FileReader'ではなく、自動的にバイトを文字に変換しますか? – Andreas
@Andreas RandomAccessFileには、seek(long pos)という関数があり、ファイルのX個のバイトを前に開いたり読んだりすることなくジャンプさせることができます。 – MrJalapeno
しかし、シークはUTF-8シーケンスの途中に上陸するかもしれないので、どこにシークするのかはどうやって決めるのですか? UTF-8では、文字は可変バイト数を占有するため、スキップするバイト数は読み取ることができません。 – Andreas