使用delphi编写文本时编码问题

时间:2014-10-09 04:56:01

标签: php delphi unicode encoding

我正在编写一个php文件,但在这个确切的行上遇到了问题

Writeln(f,'<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
/note i used a coupla extra ( )

写下我网页的负责人。

如果我拿出来,所有角色都会顺利进行(Ç, é, ó, some others) 但这条线对于网页是必要的。

不知道该怎么做= /

2 个答案:

答案 0 :(得分:3)

如果你有一个新的&#34; Delphi(2009+)您可以使用TStringlist来构建您的php文件

var
  myPhpFile: TStringlist;
begin
  myPhpFile := TStringlist.Create;
  try
    myPhpFile.Add('<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
    myPhpFile.SaveToFile('myFile.php', TEncoding.UTF8);
  finally
    myPhpFile.Free;
  end;
end;

答案 1 :(得分:3)

您正在使用Writeln编写文件,这是传统的Pascal I / O.这不支持Unicode,您需要使用不同的方法编写文件。

显而易见的方法是使用流编写器类:

Output := TFileStream.Create(...);
Writer := TStreamWriter.Create(Output, TEncoding.UTF8);
Writer.WriteLine(
  '<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>'
);

传递给编写器构造函数的编码参数确保编写器使用正确的文本编码对文本进行编码,在本例中为UTF-8。


正如Jan指出的那样,这将发出一个你不想要的BOM。因此,您可以派生出一个不会发出BOM的编码类。

type
  TUTF8EncodingWithoutBOM = class(TUTF8Encoding)
  public
    function GetPreamble: TBytes; override;
  end;

function TUTF8EncodingWithoutBOM.GetPreamble: TBytes;
begin
  Result := nil;
end;

在初始化时创建此类的单个全局实例,并将其传递给流编写器。