编码问题写用delphi
我正在写一个PHP文件中的文本,但在这个确切的行编码问题写用delphi
Writeln(f,'<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
/note i used a coupla extra ()
写入我的网页的头部有一个问题。
如果我把它拿出来,所有的字符都会顺利地进行下去(Ç, é, ó, some others)
但是这一行对网页是必需的。
不知道该怎么办=/
如果你有一个“新”德尔福(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;
在初始化创建这个类的一个全局实例,并把它传递到流作家。
这是否也写入BOM? – 2014-10-09 12:04:34
我想知道为什么它默认写入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
@RudyVelthuis由于历史原因,BOM似乎在Windows上占上风。 – 2014-10-10 09:42:23
只是要确定...你有unicode的问题? – 2014-10-09 05:36:36
只需通过编写此标题行,写入的输出就不会变成奇迹般的UTF8。根据您的Delphi版本,您可以编写ANSI或UTF16,但从不使用UTF8。您必须确保以UTF8编码编写字符串 – 2014-10-09 06:27:58