我正在寫一個PHP文件中的文本,但在這個確切的行編碼問題寫用delphi
Writeln(f,'<(meta http-equiv="Content-Type" content="text/html; charset=utf-8" /)>');
/note i used a coupla extra ()
寫入我的網頁的頭部有一個問題。
如果我把它拿出來,所有的字符都會順利地進行下去(Ç, é, ó, some others)
但是這一行對網頁是必需的。
不知道該怎麼辦=/
我正在寫一個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