8

MSXML DOMからプルされたバリアントbstrがあるので、UTF-16にあります。私はこの変換でどのデフォルトのエンコーディングが発生するかを理解しようとしています:

VARIANT vtNodeValue;
pNode->get_nodeValue(&vtNodeValue);
string strValue = (char*)_bstr_t(vtNodeValue);

テストから、デフォルトのエンコーディングはWindows-1252またはAsciiのいずれかであると思いますが、確かではありません。

ところで、これは私が修正してバリアントをwstringに変換し、WideCharToMultiByteを呼び出してマルチバイトエンコーディングに移行するコードのチャンクです。

ありがとう!

4

2 に答える 2

10

operator char*メソッドはを呼び出します_com_util::ConvertBSTRToString()ドキュメントはかなり役に立ちませんが、変換を行うために現在のロケール設定を使用していると思います。

アップデート:

内部的には、を_com_util::ConvertBSTRToString()呼び出しWideCharToMultiByte、すべてのコードページとデフォルトの文字パラメータにゼロを渡します。これは、渡すことと同じですCP_ACP。つまり、システムの現在のANSIコードページ設定(現在のスレッド設定ではない)を使用することを意味します。

データの損失を避けたい場合は、おそらくWideCharToMultiByte直接呼び出してを使用する必要がありますCP_UTF8。文字列をnullで終了するシングルバイト文字列として扱い、を使用するstd::stringことはできますが、バイトを文字として扱うことはできません。

于 2009-12-01T17:29:14.317 に答える
0

std::stringそれ自体では、エンコーディングを指定/含まれていません。これは単なるバイトのシーケンスです。同じことがstd::wstring、単なるwchar_tsのシーケンス(Win32では2バイトワード)にも当てはまります。

演算子char*を介してに変換_bstr_tすることにより、生データへのポインターを取得するだけです。MSDNによると、このデータはワイド文字、つまりUTF-16を表すsで構成されています。char*wchar_t

これからを構築することが実際に機能することに驚いていstd::stringます。最初のゼロバイトを超えてはいけません(元の文字列が英語の場合、すぐに発生します)。

ただし、wstringはの文字列であるため、次wchar_tのように、から直接作成できるはずです。_bstr_t

_bstr_t tmp(vtNodeValue);
wstring strValue((wchar_t*)tmp, tmp.length());

(私にはわかりませんlength;それはバイト数ですか、それとも文字数ですか?)次に、wstringUTF-16でエンコードされたを呼び出すことができますWideCharToMultiByte

于 2009-12-01T17:22:58.010 に答える