2014-10-09 55 views
2

我正在寫一個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

回答

3

如果你有一個「新」德爾福(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; 
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; 

在初始化創建這個類的一個全局實例,並把它傳遞到流作家。

+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