我使用此代码加载文本文件(我的文件编码为UTF-8 )(How to read a text file that contains 'NULL CHARACTER' in Delphi?):
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
更改为TEncoding.Default
。整个文本已加载,但格式不正确且无法读取。
我猜有些字符是UTF 8不支持的。因此,加载过程在想要加载该char时停止。
请帮助。任何解决方法?
****编辑:**
我确定它的UTF-8
和纯文本。这是一个HTML源文件。我确定它有空字符我用Notepad ++看到它们而且Richedit.Plainext
的值是true
答案 0 :(得分: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;
答案 1 :(得分:2)
由于您要加载HTML文件,因此需要预先解析HTML并检查其<head>
标记是否包含指定特定字符集的<meta>
标记。如果是,您必须使用该字符集加载HTML,否则它将无法正确解码为Unicode。
如果HTML中没有指定字符集,则必须选择适当的字符集,或者询问用户。例如,如果要从Web服务器下载HTML,则可以检查是否在HTTP Content-Type
标头中指定了字符集,如果是,则将该字符集保存在HTML中(甚至在HTML中),以便您可以使用它以后。否则,下载HTML的默认字符集通常是ISO-8859-1,除非另有说明。
如果您知道HTML实际上是UTF-8编码的事实,那么您应该以UTF-8加载HTML的唯一时间。您不能盲目地假设HTML是UTF-8编码的,除非您是首先创建HTML的人。
根据您的描述,听起来您的HTML不是UTF-8。但是很难确定,因为你没有提供你想要加载的文件。