编码问题写用delphi

问题描述:

我正在写一个PHP文件中的文本,但在这个确切的行编码问题写用delphi

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

写入我的网页的头部有一个问题。

如果我把它拿出来,所有的字符都会顺利地进行下去(Ç, é, ó, some others) 但是这一行对网页是必需的。

不知道该怎么办=/

+0

只是要确定...你有unicode的问题? – 2014-10-09 05:36:36

+0

只需通过编写此标题行,写入的输出就不会变成奇迹般的UTF8。根据您的Delphi版本,您可以编写ANSI或UTF16,但从不使用UTF8。您必须确保以UTF8编码编写字符串 – 2014-10-09 06:27:58

如果你有一个“新”德尔福(2009+),你可以SE一个的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; 

你写文件使用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; 

在初始化创建这个类的一个全局实例,并把它传递到流作家。

+0

这是否也写入BOM? – 2014-10-09 12:04:34

+0

我想知道为什么它默认写入BOM。对于UTF-8,建议不要写一个IIRC。 [Wikipedia](http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8)说:“Unicode标准允许使用UTF-8的BOM,但不要求或推荐使用它。” – 2014-10-10 09:10:44

+0

@RudyVelthuis由于历史原因,BOM似乎在Windows上占上风。 – 2014-10-10 09:42:23