私は Delphi 2009 を同梱の Indy ライブラリ (10) と共に使用しており、TPageProducer を多用するレガシー アプリケーションをアップグレードしています。レガシー アプリは、もともと Delphi 5 / Indy 8 用に作成されました。
TPageProducer の OnHTMLTag プロパティを使用して、ソース内の HTML 透過タグを処理する関数を指定しています。私の問題は、Unicode (簡体字中国語) 文字を TPageProducer.HTMLDoc プロパティに入れると、OnHTMLTag コールバックが呼び出されたときに、TagParams 引数に ?? が含まれることでした。予想される漢字の代わりに。
これを HTTPApp.pas の 2053 行付近までたどりました。ここで、透過タグのキーと値のペアを分離しています。
procedure ExtractHeaderFields(Separators, WhiteSpace: TSysCharSet; Content: PChar;
Strings: TStrings; Decode: Boolean; StripQuotes: Boolean = False);
...
if Decode then
Strings.Add(string(HTTPDecode(AnsiString(DoStripQuotes(ExtractedField)))))
else
Strings.Add(DoStripQuotes(ExtractedField));
...
文字列を AnsiString にキャストして HTTPDecode に渡すまでは問題ありません。この時点で、文字列リストに ?? が含まれます。私の最終的な TagParams と Web ページと同様に。
AnsiStrings の代わりに Strings で動作する HTTPDecode のバージョンが必要ですか? もしそうなら、どこでこれを見つけることができますか?
今のところ、TPageProducer のトークンを解析するときにデコード ルーチンを無効にしましたが、これは適切な修正ではなく、ワイド文字で動作するバージョンが必要です (可能であれば)。