1

私は HTTP POST (x-www-form-urlencoded) の受信側にいて、フィールドの 1 つに XML ドキュメントが含まれています。そのドキュメントを受け取り、いくつかの要素を調べて、データベースに保存する必要があります (後で使用するため)。ドキュメントは UTF-8 形式 (および適切なヘッダーを持つ) であり、多くの奇妙な文字が含まれている可能性があります。

データを受け取ると、次のようになります。

Set xmlDoc = CreateObject("MSXML2.DOMDocument.3.0")
xmlDoc.async = False
xmlDoc.loadXML(Request.Form("xml"))

DOM 文書から掘り出すことができるものはすべて、依然として UTF-8 形式です。たとえば、このドキュメント (大幅に簡略化されています):

<?xml version="1.0" encoding="UTF-8"?>
<data>
 ä
</data>

常に次のように出てきます

<?xml version="1.0" encoding="UTF-8"?>
<data>
 ä
</data>

xmlDoc.XML を見ると、次のようになります。

<?xml version="1.0"?>
<data>
 ä
</data>

ヘッダーからエンコーディングを削除します (VBScript で使用している文字列は「エンコーディングにとらわれない」ため、この種の意味はあります) が、それでも UTF-8 でエンコードされたドキュメントを表す一連の文字です。

MSXML がヘッダーのエンコーディング情報を気にしていないかのようです。問題は MSXML にあるのか、それとも投稿データのエンコーディングにあるのか? これは「ダブル エンコーディング」の形式であり、最初に UTF-8 (特定の文字が数バイトで書き込まれる) で、次に 1 バイトずつ urlencode されます (「ä」は実際には %C3%A4 として送信されます)。

常に UTF-8 であると想定するようなハードコーディングはしたくありません (将来的には UTF-16 になる可能性があるため)。データにはキリル文字やアラビア文字が含まれている可能性があるため、他の文字セット (iso-8859-1 など) への「ハード変換」もできません。これを修正するにはどうすればよいですか?

4

2 に答える 2

3

オプション1

フォーム フィールドを読み取る前に Response.CodePage の値を変更します。

Response.CodePage = 65001

問題は、受信ページがフォーム データのコンテンツを UTF-8 でエンコードされていると認識していないことです。したがって、%C3%A4 データは 2 つの異なる ANSI 文字として認識されます。ページ Response.CodePage は、クライアントから送信された文字セット情報がない場合にフォーム データがどのようにデコードされるかに奇妙な影響を与えます。

オプション 2

ソース ページのフォーム要素を変更します。それに次の属性を追加します:-

<form accept-charset="UTF-8" ...>

これにより、ポスト内の文字の UTF-8 エンコードが強制され、ポストが選択された文字セットに関するデータを運ぶようになります。これにより、データを正しくデコードするために必要な情報がサーバーに提供されます。

オプション 3

最後に、私の個人的な好みとして、XML をフィールド値としてフォームに投稿しないでください。代わりに、他のフォーム フィールドの値を属性または要素として XML に追加し、XmlHttpRequest. ナビゲーションのために、サーバーが要求を受信したときに適切なアクションを実行できるように、投稿されたデータへの GUID ハンドルを含む、クライアントが移動する必要がある URL をサーバーに返させます。ただし、これはすべてかなり手間がかかることを認識しています。その場合、他の 2 つのオプションのいずれかが機能するはずです。

于 2009-09-17T14:25:19.833 に答える
0

オプション 3 は、このような書き換えの複雑さが増すため、現時点ではほとんど除外できます。

オプション1は、応答のコードページが要求で何が起こるかを決定する必要があるという私には奇妙に思えますが、それがそうである場合はそうです。

オプション 2 については、実際にはブラウザー フォームの投稿ではなく、小さなスクリプト クライアント (CURL を使用) です。スクリプト化されたリクエストに追加できる、そこから送信された結果の HTTP ヘッダーは何でしょうか?

全体として、これは、文字列からロードするときに、MSXML が xml ヘッダーに設定されているエンコーディングを単純に無視することを意味していると思います。

于 2009-09-17T18:01:42.610 に答える