isapi(pageproducers)アプリケーションをdelphi7からdelphi2009に移植しています。ページは、UTF8のhtmlファイルに基づいています。
Onhtmltagが起動され、透明なタグをアクセント文字(áé...)などの特殊文字で任意の値に置き換える場合を除いて、すべてがうまくいきます。これらの文字は、出力で�文字に置き換えられます。
どうしたの?
isapi(pageproducers)アプリケーションをdelphi7からdelphi2009に移植しています。ページは、UTF8のhtmlファイルに基づいています。
Onhtmltagが起動され、透明なタグをアクセント文字(áé...)などの特殊文字で任意の値に置き換える場合を除いて、すべてがうまくいきます。これらの文字は、出力で�文字に置き換えられます。
どうしたの?
デバッグ手順の一環として、ブラウザが疑問符文字に対して受け取るバイト値を正確に調べる必要があります。
ご存知のように、以前のバージョンはすべて ANSI でしたが、Delphi 2009 の文字列型は Unicode です。この型はDelphi 7 で導入されましたUtf8String
が、Delphi 2009 ではその型が特別なものになりました。UTF-8 としてエンコードされた文字列を保持するためにその型を使用していない場合は、使用を開始する必要があります。Utf8String
変数に保持されているUnicodeString
値は、一方を他方に割り当てると自動的に値に変換されます。
UTF-8 でエンコードされた文字列を通常のAnsiString
変数に格納している場合、UnicodeString
. それはあなたが望むものではありません。
UTF-8 でエンコードされたリテラルを type の変数に割り当てている場合はstring
、それをやめてください。WideString
その型は、いつものように、その値が UTF-16 としてエンコードされることを期待しています。
を使用してファイルをTStrings
子孫にロードする場合はLoadFromFile
、そのメソッドの 2 番目のパラメーターの使用を開始する必要があります。これは、使用するエンコーディングを指定します。UTF-8 でエンコードされたファイルは、TEncoding.UTF8
. デフォルトはTEncoding.Unicode
で、リトルエンディアンの UTF-16 です。
助けてくれてありがとう、いくつかのテストの後、問題は非常に単純でした(または愚かでもありました)
response.contenttype := 'text/html charset=UTF-8'
unicodestring utf8string ansistring widestring の間で手動で変換する必要はありません。Delphi 2009 の文字列の使用法はほぼ完璧です。