2016-03-22 17 views
1

當您保存文件時,Unicode字符存儲爲字符編碼如何以正確的編碼保存文件?

TMemoryStream *MS = new TMemoryStream; 
TStringList *list = new TStringList; 
list->Add(u"call=expose_full"); 
IdHTTP1->Post(u"URL", list, MS); 
MS->SaveToFile("1.html"); 

例如「亞洲貨櫃\ u00e9tico拉斐拉統計」

+0

不要忘了指定你使用的是什麼樣的Unicode,IE:UTF-16用於Windows,UTF-8用於大多數其他系統。等等。 –

+0

從指定下載的網站:content-type:text/html; charset = UTF-8 –

+0

我對「TmemoryStream」類不熟悉,可能需要指定它來自哪個API--但是它是否可以使用「二進制」輸出(類似於fstream)保存文件? –

回答

1

您正在使用的版本Post(),作爲寫入服務器的原始數據 - 到TStreamTMemoryStream只是一個內存緩衝區,它沒有字符串,字符或編碼的概念。您完全按照服務器發送的內容保存HTML文件。無論是使用UTF-8,UTF-16,Ansi等等。

如果您想要將文件保存爲您選擇的特定編碼,則必須在下載後自行轉換數據。例如,通過使用Post()的版本,返回String,而不是填充TStream,那麼你可以使用一個TStringListTStringString,或System::Ioutils::TFile::WriteAllText()方法,使用特定TEncodingTEncoding::UTF8String保存到一個文件。

或者,如果服務器支持它,您可以使用TIdHTTP::Request::AcceptCharSet屬性指定您願意從服務器接受哪個字符集,然後服務器可以相應地對其響應進行編碼。然後您可以繼續使用上面顯示的原始代碼。

相關問題