2013-07-11 87 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