2016-10-12 18 views
0

我已經將應用程序從D2007升級到XE6。它將數據發佈到網絡服務器。Delphi tidhttp編碼特殊字符

我不能確定什麼編碼會正確地發送左右引號字符(下面的代碼片段)。我嘗試了所有可以找到的選項,但發送時編碼爲?(就我看到的WireShark而言)。

D2007沒有問題,但XE6是關於Unicode的,我不確定問題是編碼還是代碼頁或什麼。

Params := TIdMultipartFormDataStream.Create; 
    params.AddFormField('TEST', 'Test ‘n’ Try', 'utf8').ContentTransfer := '8bit'; 
    IdHTTP1.Request.ContentType := 'text/plain'; 
    IdHTTP1.Request.Charset := 'utf-8'; 
    IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream); 

回答

5

當調用params.AddFormField(),你設置的字符集,以'utf8',這不是一個有效的字符集名稱。官方字符集名稱爲'utf-8'代替:

params.AddFormField('TEST', 'Test ‘n’ Try', 'utf-8').ContentTransfer := '8bit'; 

編譯時對Unicode的,無效的字符集最終使用Indy的內置8位編碼,編碼的Unicode代碼頁> U + 00FF的字節0x3F的('?')。您正在使用的引號字符是,分別是代碼點U + 2018和U + 2019。

您在D2007中沒有遇到此問題的原因是因爲在爲Ansi進行編譯時爲編碼目的而忽略TIdFormDataField.Charset屬性。該TIdFormDataField.FieldValue屬性是一個AnsiString,其原始字節將它添加到TIdMultipartFormDataStream,如之前需要發送原樣,所以你必須確保它是正確編碼:

params.AddFormField('TEST', UTF8Encode('Test ‘n’ Try'), 'utf-8').ContentTransfer := '8bit'; 

在一個側面說明,你不需要在發佈TIdMultipartFormDataStream時發送Request.ContentTypeRequest.Charset屬性(尤其是因爲'text/plain'對於MIME郵件而言是無效的內容類型)。這的Post()版本會爲你設置這些屬性:

Params := TIdMultipartFormDataStream.Create; 
params.AddFormField(...); 
IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream); 
+0

測試€~n’嘗試 – Tony

+0

哎呀 在Wireshark的包現在包含 – Tony

+0

0000 54 45 53 54 54 3D 65 73 74 25 2B 45 32 25 38 30 TEST =測試+%E2%80 0010 25 39 38 6e 25 45 32 25 38 30 25 39 39 2b 54 72%98n%E2%80%99 + Tr 但上述網站顯示 – Tony