无法使用UTF-8编码

时间:2013-07-11 10:22:59

标签: delphi delphi-2010

我使用此代码加载文本文件(我的文件编码为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

2 个答案:

答案 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。但是很难确定,因为你没有提供你想要加载的文件。