3

Java で、ギリシャ記号などの複雑なテキストを含む HTML ファイルを解析しようとしています。

テキストに左向きの引用符が含まれている場合、既知の問題が発生します。のようなテキスト

mutations to particular “hotspot” regions

になる

 mutations to particular “hotspot�? regions

簡単なテキストコピー方法を書くことで問題を切り分けました:

public static int CopyFile()
{
    try
    {
    StringBuffer sb = null;
    String NullSpace = System.getProperty("line.separator");
    Writer output = new BufferedWriter(new FileWriter(outputFile));
    String line;
    BufferedReader input =  new BufferedReader(new FileReader(myFile));
while((line = input.readLine())!=null)
    {
        sb = new StringBuffer();
        //Parsing would happen
        sb.append(line);
        output.write(sb.toString()+NullSpace);
    }
        return 0;
    }
    catch (Exception e)
    {
        return 1;
    }
}

この問題を修正する方法について、誰かアドバイスをいただけますか?

★私の解決策

InputStream in = new FileInputStream(myFile);
        Reader reader = new InputStreamReader(in,"utf-8");
        Reader buffer = new BufferedReader(reader);
        Writer output = new BufferedWriter(new FileWriter(outputFile));
        int r;
        while ((r = reader.read()) != -1)
        {
            if (r<126)
            {
                output.write(r);
            }
            else
            {
                output.write("&#"+Integer.toString(r)+";");
            }
        }
        output.flush();
4

3 に答える 3

6

読み取られたファイルは、書き込まれたファイル (おそらく ISO-8859-1) と同じエンコーディング (おそらく UTF-8) ではありません。

UTF-8 エンコーディングのファイルを生成するには、次の手順を試してください。

BufferedWriter output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"UTF8"));

残念ながら、ファイルのエンコーディングを決定することは非常に困難です。Javaを参照してください: ストリームの正しい文字セット エンコーディングを確認する方法

于 2010-08-24T17:54:02.123 に答える
0

Thierry-Dimitri Roy が書いたものに加えて、エンコーディングがわかっている場合は、FileReaderを少し追加で作成する必要があります。ドキュメントから:

文字ファイルを読み取るための便利なクラス。このクラスのコンストラクターは、既定の文字エンコーディングと既定のバイト バッファー サイズが適切であることを前提としています。これらの値を自分で指定するには、FileInputStream で InputStreamReader を作成します。

于 2010-08-24T18:00:20.890 に答える
0

Javadoc forFileReaderは次のように述べています。

このクラスのコンストラクターは、既定の文字エンコーディングと既定のバイト バッファー サイズが適切であることを前提としています。これらの値を自分で指定するには、FileInputStream で InputStreamReader を作成します。

あなたの場合、デフォルトの文字エンコーディングはおそらく適切ではありません。入力ファイルが使用するエンコーディングを見つけて指定します。例えば:

FileInputStream fis = new FileInputStream(myFile);
InputStreamReader isr = new InputStreamReader(fis, "charset name goes here");
BufferedReader input = new BufferedReader(isr);
于 2010-08-24T18:00:48.003 に答える