std::wstring
にUTF-8文字列を格納し、std::string
に別のストア文字列(UTF-8)を格納する2つのライブラリを使用しています。
2つのライブラリ間で文字列を渡すために使用できる最も効率的な方法は何ですか?
私は現在Windows上でVisual C++ v9 Expressを使用していますが、ポータブルなソリューションを好むでしょう。std :: wstringとstd :: stringの間のUTF-8エンコード文字列の処理
答えて
std::wstring
の場合はUTF-16を意味し、UTF-8を意味しないと仮定すると、1つのライブラリから別のライブラリに文字列をエンコード/デコードする必要があります。 STLが提供しているかどうかはわかりませんが、Windowsの独自のMultiByteToWideChar()
とWideCharToMultiByte()
関数を使用すると、ほんの数行のコードでUTF-8とUTF-16を変換できます。あなたはよりポータブルなものを見つけたときにロジックを置き換えることができますので、あなたはその後、例えば、独自の関数にその可能性をラップ:
std::wstring Utf8ToUtf16(const std::string &s)
{
std::wstring ret;
int len = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0);
if (len > 0)
{
ret.resize(len);
MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.length(), const_cast<wchar_t*>(ret.c_str()), len);
}
return ret;
}
std::string Utf16ToUtf8(const std::wstring &s)
{
std::string ret;
int len = WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), NULL, 0, NULL, NULL);
if (len > 0)
{
ret.resize(len);
WideCharToMultiByte(CP_UTF8, 0, s.c_str(), s.length(), const_cast<char*>(ret.c_str()), len, NULL, NULL);
}
return ret;
}
はICU考えてみましょう。これは移植性があり、エンコーディングの間に多くのコンバータを持っています
私の現在のニーズには大きすぎます。私のプログラムは、ランタイムに静的にリンクされた400KB未満です。 ICUはおそらくサイズが2倍以上になり、静的にリンクできるかどうかはわかりません。 – user754425
ICUでなければ 'iconv'。これもPOSIXです。 –
- 1. の変換C++のstd :: wstringのにUTF8でのstd :: codecvt_xxx
- 2. std :: stringと文字列
- 3. std :: string、wstring、u16/32string解説
- 4. のstd ::リスト<std::string> ::イテレータはstd ::文字列にする
- 5. はCでのstd ::文字列をエンコード++
- 6. .NET System :: std :: stringへの文字列
- 7. std :: stringとstd :: mapオペレーションがUnicode文字列にある
- 8. vC++のstd :: string/std :: wstringのマクロは何ですか? MSDNによると
- 9. MultiByteToWideCharArrayを使用してstd :: stringをstd :: wstringに変換する理由
- 10. C++はstd :: stringからstd :: wstringへデータをコピーします
- 11. std :: string&std :: wstringからchar整数値を取得する
- 12. std :: std :: stringとstd :: vectorの間の移動<unsigned char>
- 13. jstring(JNI)からutf8文字を含むstd :: string(C++)
- 14. のstd ::文字列:: c_str()と
- 15. パフォーマンスのstd :: STD対はstrstr ::文字列::
- 16. std :: stringの各文字のアドレス
- 17. のstd ::文字列とUTF-8エンコードされたUnicode
- 18. のstd ::文字列::長さ()はstd ::文字列対::サイズ()
- 19. std :: vector <std::string>空の文字列を代わりに挿入
- 20. 文字列の比較。どのようにstd :: wstringと文字列を比較できますか? WRT strcmp
- 21. 2つのイテレータの間で `std :: string 'の部分文字列を取得する
- 22. のstd ::文字列の文字参照
- 23. は「のstd ::文字列」
- 24. 文字列UTF8エンコードの問題
- 25. Cスタイルの文字列をC++のstd :: stringに変換する
- 26. std :: map <std :: string、std :: string> JavaCPPの変換
- 27. ブーストのwstring文字列コンバータ
- 28. どのようなタイプの "Cスタイルの文字列"とstd :: stringとの関係
- 29. 複数のchar *文字列をstd :: stringにフォーマットする
- 30. std :: stringのセグメンテーションフォルト
「UTF-8文字列をstd :: wstringに格納する」と言うと、正確には何を参照していますか?あなたは実際にUTF-16を意味しましたか? std :: wstringはUTF-8オクテットを格納するのには適していません(ただし、std :: stringは)。 –
@Remy LebeauデータベースからUTF-8データを取得し、std :: wstringsにデータを渡すODBCライブラリです。 実際にデータが実際にライブラリに格納される方法はわかりません。 – user754425
ライブラリが内部的にどのようにデータを操作するかは関係ありません。重要なことは、そのデータをコードとの間でどのように渡すかです。そのために 'std :: wstring'を使用している場合は、UTF-16を使用している/期待している可能性があります。 UTF-8とUTF-16は、同じUnicode文字セットの異なるエンコーディングであるため、意味があります。データベースはUTF-8以外の文字セットを使用している可能性があり、ODBCは内部的にそれを処理し、一貫性のためにUTF-16を使用してデータを渡します。 –