日本語の文字列でSOAP呼び出しを作成しようとしています。私が直面した問題は、この文字列をUTF8でエンコードされた文字列にエンコードすると、多くの制御文字が含まれることです(たとえば、0x1B(Esc))。このような制御文字をすべて削除して有効なSOAP呼び出しにすると、サーバー側で日本語のコンテンツがゴミとして表示されます。日本語の文字に対して有効なSOAPリクエストを作成するにはどうすればよいですか?どんな提案でも大歓迎です。私はMS-DOMでC++を使用しています。
敬具。
私の記憶が正しければ、最初の 32 個の Unicode コード ポイントは、XML ドキュメントの文字として許可されず、&#
. HTMLで許可されているかどうかはわかりませんが、サーバーはリクエストで許可されていないと判断し、意味のある投票のみを取得します.
あなたの文書はiso-2022-jp
ではなくでエンコードされていると主張していることに気付きましたutf-8
。実際、ESC $ B
ドキュメントに表示される文字列は有効な iso-2022-jp です。これは、データのエンコーディングが (ASCII から JIS X 0208-1983 と呼ばれる 2 バイトの日本語エンコーディングに) 切り替わっていることを示します。
しかし、リクエストを構築する過程のどこかで、何かがその0x1B
バイトを見て、文字 U+001B として解釈しましたが、ドキュメントのエンコーディングで既にエンコードされているデータの 1 バイトとして意図されていることを認識していません。そのため、有効な XML ではありませんが、「ベスト エフォート」として XML エスケープされています。
おそらく、XML 文書をシリアライズしているものは何であれ、エンコーディングがiso-2022-jp
. ドキュメントをASCII、ISO-Latin-1、またはUTF-8としてシリアル化することになっていると考えていると思いますが、<meta>
要素はそれにとって何の意味もありません(とにかくエンコーディングを指定するHTMLの方法であり、XMLでは特に重要ではありません) )。しかし、私は MS-DOM を知らないので、それを修正する方法がわかりません。
iso-2022-jp データから文字を削除するだけESC
では、データのエンコーディングが切り替わったという事実が隠されるため、デコーダは7nMK
、JIS X 0208 として解釈されるはずのすべてのものを ASCII として解釈し続けます。 -1983年。したがって、ゴミ。
他に奇妙なこと - iso-2022-jp
ASCII に戻すコードは ですが、最初の ESC 文字に起こったのと同じことが 2 番目の ESC 文字にも起こると予想されるときに、あなたのデータESC ( B
を参照してください: 。同様に、とは ASCII から JIS X 0208-1983 に、またその逆に切り替えようとする試行錯誤であり、ここでも文字はエスケープされるのではなく、消えてしまいます。|(B</font>
�x1B(B</font>
$B#M#S(B
$BL@D+(B
ESC
一部の文字が消えて 1 つがエスケープされた理由についての説明はありESC
ませんが、生成されたものが valid のように見えるのは偶然ではありませんが、完全ではありませんiso-2022-jp
。iso-2022-jp は 7 ビット エンコーディングだと思うので、問題の一部は iso-2022-jp データを取得し、ISO-Latin-1 (または他の 8下位半分が ASCII (Windows コード ページなど) に一致するビット エンコーディングを UTF-8 に変換します。その場合、この関数は 7 ビット データを変更せずに残し、UTF-8 に変換しません。次に、UTF-8 として解釈されると、データには ESC 文字が含まれます。
データを UTF-8 として送信したい場合は、まず実際に iso-2022-jp から変換する必要があります (ワイド文字または UTF-8、SOAP または XML ライブラリが期待する方)。次に、iso-2022-jp ではなく、UTF-8 としてラベルを付ける必要があります。最後に、文書全体を UTF-8 としてシリアライズする必要がありますが、既に述べたように、すでにそうしているかもしれません。
Steve Jessop が指摘したように、テキストを UTF-8 ではなく iso-2022-jp としてエンコードしたようです。したがって、最初に行うことは、それをチェックして、適切な UTF-8 を使用していることを確認することです。
それでも問題が解決しない場合は、テキストのエンコードを検討してください。
最も単純なオプションは、各バイトの 16 進値を ASCII 数字として書き込む「16 進エンコード」です。たとえば、0x1B バイトは「1B」、つまり 0x31、0x42 になります。
派手にしたい場合は、MIME または UUENCODE を使用できます。