2017-11-19 12 views
0

Post()メソッドから得られた結果のアクセントに関する大きな問題があります。TIdHTTPです。TIdHttpとDelphiを使用したISO-88559-1エンコーディングでのエラー

私がアクセスしているURLはすでに正しくコーディングされています。結果がテキストファイルに保存されているだけです。しかし、私が作成した関数でデータをDelphiに持ってくると、アクセント付きの文字の代わりに、文字 "?"出現している。

たとえば、ページの結果がConexão não configuradaの場合、関数の結果はConex?o n?o configuradaになります。

StackOverflowでここに投稿されたいくつかのフォームを試しましたが、成功しませんでした。次のように

My機能は次のとおりです。

function HttpPost(PostUrl: string; PostParams: TStringList): string; 
var 
    IdHTTP1: TIdHTTP; 
    IOHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    IdHTTP1 := TIdHTTP.Create(nil); 
    IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    IdHTTP1.IOHandler := IOHandler; 
    IdHTTP1.HandleRedirects := True; 
    IdHTTP1.Request.ContentType := 'text/html'; 
    IdHTTP1.Request.CharSet := 'ISO-8859-1'; 
    IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; 
    IdHTTP1.ReadTimeout := 20000; 
    try 
    Result := IdHTTP1.Post(PostUrl, PostParams); 
    except 
    on E:Exception do 
    begin 
     Result := 'ErrorExcept'; 
     Msg(E,2); 
    end; 
    end; 
    IdHTTP1.Free; 
    IOHandler.Free; 
end; 

インディの更新バージョン10.6.2.0

+0

参考までに、インディの現在のバージョンは10.6.2.5438 –

答えて

1

であなたがデルファイのANSIバージョンを使用している(デルファイは2009年にUnicodeに切り替え)。

Stringを返すバージョンは、Content-Typeレスポンスヘッダーで報告された文字セットを使用して生のサーバーデータをUnicodeにデコードします。文字セットが指定されていない場合は既定値です。したがって、送信されるデータが実際に正しい文字セットでエンコードされていること、およびその文字セットが正しく報告されていることを確認してください。

StringUnicodeStringの別名であるUnicodeバージョンのDelphiでは、このUnicodeデータはそのままの状態で返されます。

StringAnsiStringの別名であるANSIバージョンのDelphiでは、Post()はこのUnicodeデータをANSIに変換して出力します。表示されている?の文字は、Unicodeデータに変換されるANSI charsetに存在しない文字が含まれていることを意味します。 Post()には、出力に必要なANSI文字セットを指定するオプションのADestEncodingパラメータがあります。指定されない場合、Indyのデフォルトエンコーディングが使用されます。このデフォルトは、IdGlobalユニットのグローバルGIdDefaultTextEncoding変数によって制御され、デフォルトでencASCII(7ビットUS-ASCII)に設定されています。

出力ANSI文字セットは、生データによって使用される文字セットと同じである必要はありません。 ADestEncodingのポイントは、あなたが出力になりたい文字セットを指定することである。

あなたが前もって使用する正確なANSI文字セットがわかっている場合は、その文字セットのためにIIdTextEncodingADestEncodingを設定することができ、 IdGlobalProtocolsユニットのCharsetToEncoding()ファンクションまたはIdGlobalユニットのIndyTextEncoding()ファンクションのように、

それとも、あなたのコードが実行されているマシンのOSのデフォルトの文字セットを使用するためには、IndyTextEncoding_OSDefaultADestEncodingを設定(またはencOSDefaultGIdDefaultTextEncodingを設定します)。

しかし、通常、UnicodeからANSIへの変換は損失が多いので、代わりにUTF-8を使用することをお勧めします。これはロスレスです。 ADestEncodingIndyTextEncoding_UTF8に設定するか、GIdDefaultTextEncodingencUTF8に設定します。

+0

です。あなたの説明と専用時間をありがとうございます。それがまさに問題でした。 –

関連する問題