3

在Java中,我试图解析一个包含复杂文本(如希腊符号)的HTML文件。从BufferedReader到BufferedWriter的字符损坏在java中

当文本包含左对齐的引号时,遇到已知问题。文字如

mutations to particular “hotspot” regions 

成为

mutations to particular “hotspot�? regions 

我已经通过书面方式一个简单的文本拷贝meathod隔离问题:

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(); 
+0

是只是我还是“缓冲”读者过时在最后一个片段? – 2013-05-29 01:40:37

回答

6

读取该文件是不是在相同的编码(可能是UTF-8)写(可能是ISO-8859-1)的文件。

尝试使用以下来产生具有UTF-8编码一个文件:

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

不幸的是,确定文件的编码是很困难的。请参阅Java : How to determine the correct charset encoding of a stream

+0

据我所知,没有一种真正的自动获取文本文件编码的方式。 – extraneon 2010-08-24 17:57:19

+0

'读者'也结束了。 – 2010-08-24 18:53:57

+0

即使在HTML中明确声明,“UTF8”和16似乎也不起作用... Anybdoy是否知道如何通过从文件中的已知字符到编码来查找编码? – Mikhail 2010-08-24 19:46:48

0

除了Thierry-Dimitri Roy写的内容外,如果您知道编码,您必须创建FileReader并添加一些额外工作。从文档:

方便阅读的类 字符文件。此类的构造函数 假定默认的 字符编码和默认的 字节缓冲区大小是适当的。至 自己指定这些值, 在 FileInputStream上构建一个InputStreamReader。

0

Javadoc for FileReader说:

这个类的构造方法假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在FileInputStream上构建一个InputStreamReader。

在你的情况下,默认的字符编码大概是而不是合适。查找输入文件使用的编码,并指定它。例如:

FileInputStream fis = new FileInputStream(myFile); 
InputStreamReader isr = new InputStreamReader(fis, "charset name goes here"); 
BufferedReader input = new BufferedReader(isr);