2014-09-26 34 views
1

以下代碼適用於Win32,無論如何,它在Android或iOS上運行時都會拋出異常。唯一的例外是:「在多字節的目標代碼頁中,爲Unicode字符沒有映射」delphi xe6目標多字節代碼頁中不存在用於Unicode字符的映射

function GetURLAsString(aURL: string): string; 
    var 
     lHTTP: TIdHTTP; 
     lStream: TStringstream; 

    begin 
     lHTTP := TIdHTTP.Create(nil); 
     lStream := TStringstream.Create(result);//create('',EEncoding.utf8),not work 
     try 

     lHTTP.Get(aURL, lStream); 
     lStream.Position := 0; 
     result := lStream.readstring(lStream.Size);//error here 
     finally 
     FreeAndNil(lHTTP); 
     FreeAndNil(lStream); 
     end; 
    end; 
+0

毫無疑問,在這裏,請澄清。移動平臺僅處理UTF-16 unicode字符串。 – 2014-09-26 13:49:03

+0

@LURD Indy能夠在移動平臺上進行翻譯並轉換爲UTF-16(由OS特定的轉換API支持) – mjn 2014-09-26 15:41:47

+0

注意:TIdHTTP.Create(nil)可以縮短爲TIdHTTP.Create – mjn 2014-09-26 15:42:53

回答

4

TStringStream不是這種情況合適的類。它要求你在其構造函數中指定一個編碼。如果您不這樣做,它會使用操作系統默認編碼。在Windows上,該默認值是針對運行應用程序的用戶帳戶的特定於語言環境的。在移動設備上,該默認值是UTF-8。

HTTP可以使用任意數量的字符集來傳輸文本。如果數據與TStringStream使用的編碼不匹配,您將遇到解碼問題。

TIdHTTP知道接收到的數據的字符集,並可以將其解碼成德爾福string你,例如:

function GetURLAsString(aURL: string): string; 
var 
    lHTTP: TIdHTTP; 
begin 
    lHTTP := TIdHTTP.Create(nil); 
    try 
    Result := lHTTP.Get(aURL); 
    finally 
    FreeAndNil(lHTTP); 
    end; 
end; 
+0

我使用這個,它不是拖放異常,但有些字符不能顯示,使用stringstream可以顯示在win32上, – miao 2014-09-26 23:35:31

+0

您使用的是Delphi的Unicode版本。無論你在哪個操作系統上運行,Delphi字符串總是在所有平臺上使用UTF-16,TIdHTTP知道如何在所有平臺上根據報告的源數據字符集將數據解碼爲UTF-16 。如果您在顯示字符時遇到問題,那麼源數據使用與報告不同的字符集進行編碼,使用Indy或操作系統不支持的字符集進行編碼,或者您不能正確顯示字符串。 – 2014-09-27 00:05:25

+0

如果數據在默認編碼下使用'TStringStream'時在Windows上顯示OK,但在Android上不顯示OK,最可能的原因是傳輸的數據使用Latin1(ISO-8859-1)或類似的字符集進行編碼,但HTTP回覆不報告。 'TIdHTTP'會將原始字節直接保存到'TStringStream'中,然後使用它自己的默認編碼(在Windows上是8位Ansi,但是在移動設備上是UTF-8)對字節進行解碼。使用我上面給出的代碼,HTTP回覆的字符集非常重要,因此它必須準確,否則數據將無法正確解碼。 – 2014-09-27 00:15:17

相關問題