2013-07-11 131 views
3

我加載使用此代碼的文本文件(我的文件編碼爲UTF-8)(How to read a text file that contains 'NULL CHARACTER' in Delphi?):不能使用UTF-8編碼工作

uses 
IOUtils; 

var 
    s: string; 
    ss: TStringStream; 
begin 
    s := TFile.ReadAllText('c:\MyFile.txt'); 
    s := StringReplace(s, #0, '', [rfReplaceAll]); //Removes NULL CHARS 
    ss := TStringStream.Create(s); 

    try 
    RichEdit1.Lines.LoadFromStream(ss, TEncoding.UTF8); //UTF8 
    finally 
    ss.Free; 
    end; 

end; 

但我的問題是,沒有按RichEdit1沒有加載全文。 這不是因爲空字符。這是因爲編碼。當我使用此代碼運行應用程序,它加載全文:

uses 
IOUtils; 

var 
    s: string; 
    ss: TStringStream; 
begin 
    s := TFile.ReadAllText('c:\MyFile.txt'); 
    s := StringReplace(s, #0, '', [rfReplaceAll]); //Removes NULL CHARS 
    ss := TStringStream.Create(s); 

    try 
    RichEdit1.Lines.LoadFromStream(ss, TEncoding.Default); 
    finally 
    ss.Free; 
    end; 

end; 

我改變TEncoding.UTF8到​​。整個文本加載但它不是正確的格式,它不可讀。

我猜有一些UTF 8不支持的字符。所以加載過程停止時,它想要加載該字符。

請幫忙。任何解決方法?

****編輯:**

我敢肯定它的UTF-8和它純文本。這是一個HTML源文件。我敢肯定,它使用記事本++看到它們的空charas並且Richedit.Plainext的值是true

+0

爲什麼您的UTF-8文件包含空字符?你是否100%確定它確實是UTF-8?此外,該文件包含什麼?它是純文本還是RTF。在調用'LoadFromStream'的時候'RichEdit1.PlainText'的價值是什麼? –

+2

*我想有一些UTF 8不支持的字符。*我真的認爲你對你正在嘗試做的事沒有什麼瞭解。當你不瞭解它時,不要試圖解決你的問題,你應該先學習。你需要在德爾福閱讀Marco關於Unicode的白皮書。是你做的嗎?我已經向你建議。你會很好地告訴我們你的整個問題。然後我們可以給你答案* right *問題。我覺得每次我們回答你的問題時,我們都會幫你解決錯誤的問題。 –

+0

謝謝!我要讀這個。 – Sky

回答

14

您應該給TFile.ReadAllText編碼。之後,您只使用Unicode字符串,並且不必在RichEdit中使用UTF8。

var 
    s: string; 
begin 
    s := TFile.ReadAllText('c:\MyFile.txt', TEncoding.UTF8); 
    // normally this shouldn't be necessary 
    s := StringReplace(s, #0, '', [rfReplaceAll]); //Removes NULL CHARS 
    RichEdit1.Lines.Text := s; 

end; 
+4

如果解決了您的問題,您應該接受該答案。 – Runner

+0

我剛遇到類似的問題。當某些UTF8代碼跨越讀取緩衝區的邊界時,似乎RichEdit在UTF8中的PlainText出現問題。 –

2

由於要裝載HTML文件時,你需要預先解析HTML,檢查其<head>標籤包含一個<meta>標籤指定特定的字符集。如果確實如此,那麼必須使用該字符集加載HTML,否則它將無法正確解碼爲Unicode。

如果在HTML中沒有指定字符集,則必須選擇適當的字符集或詢問用戶。例如,如果您要從Web服務器下載HTML,則可以檢查HTTP Content-Type標題中是否指定了字符集,如果是,則將該字符集保存爲(甚至可以)保存在HTML中,以便稍後使用。否則,除非已知,否則下載HTML的默認字符集通常是ISO-8859-1。

您唯一應該將HTML加載爲UTF-8的方式是,如果您知道HTML實際上是使用UTF-8編碼的。你不能盲目地假設HTML是UTF-8編碼的,除非你是第一個創建HTML的人。

從你所描述的,這聽起來像你的HTML不是UTF-8。但是很難確定,因爲你沒有提供你正在加載的文件。

+0

謝謝。所以我會從'meta tag'檢查網站的字符集,然後使用該字符集加載它。 – Sky