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

JavadocFileReader说:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在 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 回答