1

WinHttp.WinHttpRequest.5.1 を使用して、サードパーティの Web サービスを呼び出す古い C++ アプリがあります。

問題とは関係ないと思うので、呼び出しシーケンスのすべての詳細をリストすることはしませんが、BSTR 型の を呼び出して終了しhr = pIWinHttpRequest->get_ResponseText(&bstrResponse);ますbstrResponse

呼び出しコードは BSTR では機能せず、標準の C/C++ で機能するため、コードは BSTR をwithchar *に変換します。char *

_bstr_t b(bstrResponse);
const char *c = static_cast<char *>(b);

そして、このコードでアクセスした以前のすべての Web サービスで、これは機能しました。しかし、この新しいものはそうではありません。

返されるデータは XML であるはずですが、この 1 つの Web サービスについては、文字コード変換の問題が発生しているようです。結果の文字列は次で始まります。"?&lt;?xml version="1.0" encoding="utf-8"?&gt;..."

?冒頭の余分に注意してください。これをデバッガでbstrResponse見ていくと、 の表示値には表示されず、 の表示値にも表示されませんが、bの表示値には表示されますc

何が起こっているのかについてのアイデアはありますか?

編集済み

BSTR がマルチバイト型であることは理解していますが、この文字列のすべての文字はプレーン ASCII であり、この関数を呼び出すコードはマルチバイト文字を処理できません。Web をブラウジングすると、この特定のメカニズムが推奨されることがよくありますが、この場合は機能しません。

この文字列を BSTR から 1 バイト文字の配列に変換する必要があります。それが変換できないマルチバイト文字を取り除くことを意味するとしても。

4

2 に答える 2

2

static_caston aを使用したコード内の変換は、_bstr_tANSI に正しく変換されます。?エンコーディング変換での の出現は、文字の変換が失敗したことを示します。これの最も可能性の高い理由はbstrResponse、ANSI コードページに存在しない文字が含まれていることです。ANSIではなくUTF-8に変換する必要があると思いますが、もちろん、あなたが持っているすべての情報を持っているわけではありません.

要するに、これ?は、ソース文字列に宛先文字セットでエンコードできない文字が含まれていることを示しています。

アップデート

あなたの答えは、UTF-8に変換する必要があるというさらなる証拠を提供します。あなただけが確実に知ることができますが、あなたが提示した証拠はその結論と一致しています.

于 2013-01-21T17:49:10.320 に答える
0

2 つの問題があったことが判明しました。1 つ目は、上記の変換プロセスがバイト オーダー マークを取り除かないことです。テキストに著作権記号、ASCII '\xA9' を使用します。

BOM が取り除かれ、ハイビット文字がスペースに置き換えられると、パーサーは正常に動作します。

于 2013-01-21T17:55:11.420 に答える