6

std::wstringを変換する最善の方法について少しアドバイスを探していますが、オブジェクトstd::stringのキーとして使用するための迅速で汚い変換です。std::map<std::string, int>

マップは非常に大きく、すでにプロジェクトに十分に統合されており、この変換が必要なキーはほんの一握りしかないため、マップをキーとして受け入れるものに変更するのは無駄だと思いstd::wstringます。

変換の出力はそれほど重要ではありませんが、マップから正しい値を毎回確実に取得できるように、一貫性がなければなりません。

アプリケーションは Windows 専用アプリケーションです。

この目的のために大まかな変換を確実に行うための既知のプロセスはありますか? または、通常の適切な変換プロセスを使用するのが最善の方法でしょうか (この SO の質問/回答: How to convert wstring into string?で説明されているように)?

編集:心に留めておいてください -物事が一貫している限り、情報が失われても問題ありません。つまり、いくつかの日本語の文字を投入すると、一貫して同じ (ゴミになる可能性がある)std::stringに変換されても問題ありません。これは決して表示用ではなく、マップから値を引き出すためのキーとしてのみ使用されます。

ありがとう!

4

3 に答える 3

10

コンテンツのセマンティックには興味がなく、比較できるコンテンツだけに興味がある場合は、内部の wchar[] を 2 倍のサイズの char[] に結合し、それを使用して文字列を初期化します (アドレスを指定することにより)。 /コンストラクタ内のサイズ)

std::wstring ws(L"ABCD€FG");
std::string s((const char*)&ws[0], sizeof(wchar_t)/sizeof(char)*ws.size());

現在sは印刷できません (null 文字が含まれている可能性があります) が、割り当て可能で比較可能です。

Yoは次のように戻ることができます:

std::wstring nws((const wchar_t*)&s[0], sizeof(char)/sizeof(wchar_t)*s.size());

今すぐ比較

std::cout << (nws==ws)

印刷する必要があります1

ただし、この方法では、マップ内の順序 ( の結果operator<) が ... 0 の存在によりあいまいになり、テキストのセマティクスが反映されないことに注意してください。ただし、あいまいな検索は「順序」であるため、検索は引き続き機能します。

于 2013-03-11T07:46:04.090 に答える
9

バリアントとして、私は

std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );

たぶん、他の答えはより高速です(文字列イテレータの実装に依存します)が、これは私にとってはよりstd \ stlの方法です。しかし、そうです、これはいくつかのユニークなキャラクターを失います.

于 2014-06-23T10:49:15.057 に答える
8

std::wstring を utf-8 (WideCharToMultiByte またはこの lib: http://utfcpp.sourceforge.net/のようなものを使用)、つまり null で終わる c-string に変換してから、std::string を構築できます。それから。この変換は元に戻すことができます。

于 2013-03-11T08:15:11.590 に答える