簡體   English   中英

在Java中從BufferedReader到BufferedWriter的字符損壞

[英]Character corruption going from BufferedReader to BufferedWriter in java

在Java中,我試圖解析包含復雜文本(如希臘符號)的HTML文件。

當文本包含左向引號時,我遇到一個已知問題。 文字如

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

讀取的文件與寫入的文件(可能是ISO-8859-1)的編碼(可能是UTF-8)不同。

請嘗試以下操作以生成具有UTF-8編碼的文件:

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

不幸的是,確定文件的編碼非常困難。 請參閱Java:如何確定流的正確charset編碼

除了Thierry-Dimitri Roy所寫的內容之外,如果您知道編碼,則必須通過一些額外的工作來創建FileReader 來自文檔:

用於讀取字符文件的便捷類。 此類的構造函數假定默認字符編碼和默認字節緩沖區大小是適當的。 要自己指定這些值,請在FileInputStream上構造一個InputStreamReader。

FileReaderJavadoc說:

此類的構造函數假定默認字符編碼和默認字節緩沖區大小是適當的。 要自己指定這些值,請在FileInputStream上構造一個InputStreamReader。

在你的情況下,默認的字符編碼可能是恰當的。 找到輸入文件使用的編碼,並指定它。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM