delphi 2009 Unicode + ANSI問題
-
05-07-2019 - |
質問
delphi 7からdelphi 2009へisapi(pageproducers)アプリケーションを移植しています。ページはUTF8のhtmlファイルに基づいています。
Onhtmltagが呼び出され、アクセント付き文字(áé ...)などの特殊文字で透明タグを任意の値に置き換える場合を除き、すべてがうまくいきます。これらの文字は出力で&#に置き換えられます65533;文字。
何が問題ですか?
解決
デバッグ手順の一部として、疑問符文字に対してブラウザが受け取るバイト値を正確に調べる必要があります。
ご存知のとおり、Delphi 2009の文字列型はUnicodeですが、以前のバージョンはすべてANSIでした。 Delphi 7では Utf8String
型が導入されましたが、Delphi 2009ではその型が特別になりました。 UTF-8としてエンコードされた文字列を保持するためにそのタイプを使用していない場合は、そうすることを開始する必要があります。 Utf8String
変数に保持されている値は、一方を他方に割り当てると自動的に UnicodeString
値に変換されます。
UTF-8でエンコードされた文字列を通常の AnsiString
変数に保存している場合、 UnicodeStringに割り当てると、デフォルトのシステムコードページを使用してUnicodeに変換されます
。それはあなたが望むものではありません。
UTF-8でエンコードされたリテラルを string
型の変数に割り当てる場合は、停止します。その型は、 WideString
が常に持つように、値がUTF-16としてエンコードされることを期待しています。
LoadFromFile
を使用して TStrings
の子孫にファイルをロードする場合、そのメソッドの2番目のパラメーターの使用を開始する必要があります。 UTF-8でエンコードされたファイルは、 TEncoding.UTF8
を使用する必要があります。デフォルトは TEncoding.Unicode
で、リトルエンディアンUTF-16です。
他のヒント
これはおそらく文字エンコーディングの問題です。
Delphi IDEは通常、Windows-1252またはUTF-16を使用してソースコードをエンコードします。 HTMLはしばしばUTF-8を使用します。
おそらく、これらのエンコーディング間で音訳が必要です。 そのためには、使用されているエンコーディングを正確に調べる必要があります( Rob の言及など)。
またはHTMLエスケープアクセント付き文字に戻す( Ralph の言及など)
問題を示す小さなアプリを投稿できますか? (ユーザー名にjeroenが含まれ、ドメイン名にpluimers.comが含まれるメールについては、メールでお知らせします。)
-jeroen
ご協力ありがとうございます。テストの後、問題は非常に単純でした(または愚かでもありました)
response.contenttype := 'text/html charset=UTF-8'
unicodestring utf8stringとsistring widestringの間で手動で翻訳する必要はありません。 Delphi 2009の文字列の使用はほぼ完璧です。