2

重複の可能性:
pugi::char_t* を文字列に変換する方法

pugi:char_t* タイプを wchar_t 文字列に変換するにはどうすればよいですか?

child_value() の結果を utf8 文字列と比較したいのですが、その変換がなければそれはできません。

for (pugi::xml_node_iterator it = words.begin(); it != words.end(); ++it)
    {
        wchar_t* wordValue = it->child("WORDVALUE").child_value();
    }

この割り当ては、右側が pugi::char_t* で左側が whar_t* であるため、エラーを返します。

ありがとう

4

1 に答える 1

0

これがアイデアです。粗いバージョンでは、ライブラリを変更する必要があり、将来的には壊れる可能性がありますが、それから始めましょう:

すでに次の 2 つの関数があります。

std::string as_utf8(const wchar_t* str);
std::wstring as_wide(const char* str);

またはpugi::char_tのいずれかであることもわかっています。したがって、変換関数を呼び出すために必要なのは、ヘッダーに追加できるオーバーロードだけです。charwchar_tpugi::char_t

std::string as_utf8(const char* str) { return str; }
std::wstring as_wide(const wchar_t* str) { return str; }

これで、次のように記述できます。

pugi::char_t * mystr = get_magic_string();
std::string mystrU8 = as_utf8(mystr);

これは、オーバーロードのおかげで両方のコンパイラ設定で機能し、pugi::char_tが既にcharである場合、これは完全に最適化されます (もちろん、エンコーディングが既に UTF-8 であり、他の 8 ビット エンコーディングではないと仮定します!)。

(また、 と同じ魔法をサポートする引数を取るオーバーロードを提供する必要がありますstd::string。)std::wstringpugi::string_t


ライブラリの汚染が心配な場合は、独自のラッパーを作成します。

std::string my_utf8(const char * str) { return str; }
std::string my_utf8(const wchar_t * str) { return as_utf8(str); }
于 2011-08-21T20:31:46.683 に答える