2

私は問題を抱えていて、何が原因なのか理解できません。私はClassic ASPで書かれたレガシーWebサイトに取り組んでいます(ああ、なぜ私なのか)、ADODB.Recordsetの値が二重にエンコードされて出力される説明なしに、ランダムな時間に表示されることがあります。

二重エンコードとは、「 UTF-8 マルチバイト文字列の ASCII 表現の UTF-8 エンコード」を意味するため、「é」は「 é 」のようになります(まったく同じエンコードで)。

私を夢中にさせているのは、これがランダムな時間に発生するように見えることです。50% の時間は正しくエンコードされ、残りの 50% はそうではありません。

異なる時間に同じページで発生することを指摘しておきます。そのため、いくつかのページをロードした後、それらを正しく表示したり、壊れたり、再び正しく表示したりできます。

これは 7 年前、この Web サイトの初期の頃に起こりましたが、多くの水が橋の下を通過し、最初にこの Web サイトで働いていた人のうち、まだ会社で働いているのは 1 人だけです。彼は、問題を解決するために彼らが何をしたか思い出せず、「データベース接続のエンコーディングはセッションに保存された」ということだけを残しましたSession.CodePage = 65001

クエリを介して文字セットを強制しようとしましたutf8が、明らかに機能しませんでした。

使用するドライバーは oldeMySQL ODBC 3.51 Driverです。

アドバイスや解決策を事前に感謝します (残念ながら Classic ASP を取り除くことはできません)。

[アップデート]

これはプロットのひねりです。内容を次のように出力すると、壊れる回数が少なくなります。

Session.CodePage = 1252
Response.Write(Property)
Session.CodePage = 65001

実際、このコードはウェブサイトのいたるところで見つかりました。あたかもデータベース ドライバが接続の文字セットをまったく気にしていないかのようです。

4

2 に答える 2

1

いくつかのテストを実行し、@webaware のアドバイスのおかげで、ODBC ドライバーをバージョン5.1に更新することを確信し、いくつかの調整の後、Web サイトが安定しているように見えました。それが私が使用したコードです。

Response.AddHeader "Content-Type", "text/html; charset=UTF-8"
Session.CodePage = 65001
Dim ConnString:ConnString = "driver={MySQL ODBC 5.1 Driver};server=localhost;port=3306;database=database;uid=uid;pwd=pwd"

他の組み合わせは出力エンコーディングを壊すように見えますが、今ではそのままで動作します。

これが将来に役立つことを願っています。

于 2013-01-21T18:48:38.487 に答える
0

この動作の理由を見つけるのは非常に難しい場合があります。しかし、役立つかもしれない従来の ASP に関するいくつかの事実を指摘させてください...

セッションのエンコーディング

Session.Codepage はセッション全体に影響を与えます。つまり、後続のすべてのリクエストは指定されたコードページを使用します。それは、別のコードページを再度指定することによって、個々のaspファイルが別のエンコーディングを使用するのを止めません。そのため、アプリケーションを調べて、 Session.CodepageまたはResponse.Codepageのいずれかでエンコーディングを指定するページを探します。

ブラウザのエンコーディング:

ここで物事は本当に厄介になります。フォーム データがサーバーにポストされるとき、フォーム URL エンコーディング標準には、使用されるコード ページを宣言する規定がありません。ブラウザは、使用するエンコーディングを指定でき、フォームを含む html ページの文字セットにデフォルト設定されますが、その選択をサーバーに伝えるメカニズムはありません。

ASP は、ポストされたフォーム フィールドのコードページが、送信しようとしている応答のコードページと同じであると見なします。それを理解するために少し時間を取ってください....これは、Response.CodePage の値が Request.Form によって返される文字列に影響を与えるという直感に反することを意味します。このため、正しいコードページを早期に設定し、フォーム処理を行ってから、応答を送信する直前にコードページを設定することが重要です。これにより、予期しない結果が生じる可能性があります。

asp ファイルの文字列リテラル

スクリプト エンジンがファイルを解析すると、ファイル内のコンテンツのチャンク (スクリプト コード ブロックの外側にあるもの) が、特殊な形式の Response.Write (文字列リテラルを含む) に変換されます。スクリプトの実行がこれらの特別な書き込みに到達する時点で、プロセッサはファイル内で見つかったバイトを出力ストリームに直接コピーするだけで、エンコーディングを変換しようとしないという点で特別です。

詳細については、この質問への回答をお読みください。 内部文字列エンコーディング、Classic ASP

于 2013-01-11T14:58:24.160 に答える