std::codecvt_utf8
が変換のためにうまくいくようです。std::wstring
- >utf8
です。それはすべての私のテストに合格した。 (Windowsアプリケーション、Visual Studio 2015、ENロケールのWindows 8)
ファイル名をUTF8に変換する方法が必要でした。したがって、私のテストはファイル名に関するものです。
私のアプリでは、ファイルパスを処理するためにboost::filesystem::path
1.60.0を使用しています。うまく動作しますが、ファイル名をUTF8に正しく変換することはできません。 内部的にWindowsのバージョンboost::filesystem::path
は、ファイルパスを格納するためにstd::wstring
を使用します。残念ながら、std::string
へのビルドイン変換は正しく動作しません。
テストケース:
- は、混合シンボル
c:\test\皀皁皂皃的
(いくつかのランダムなアジアのシンボル)boost::filesystem::directory_iterator
と
- スキャンディレクトリとファイルを作成
- は、ビルドインを経由して
std::string
に変換したファイルのboost::filesystem::path
を取得変換filenamePath.string()
- あなたは
c:\test\?????
を取得します。アジアのシンボルは「?」に変換されます。良くない。
boost::filesystem
は、std::codecvt
を内部で使用します。変換のためには機能しませんstd::wstring
- >std::string
代わりのビルドでboost::filesystem::path
変換あなたは、このよう(original snippet)を変換関数を定義することができます。
std::string utf8_to_wstring(const std::wstring & str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
その後、あなたは簡単にUTF8にファイルパスを変換することができます:utf8_to_wstring(filenamePath.wstring())
。それは完全に動作します。
すべてのファイルパスで機能します。 ASCII文字列c:\test\test_file
、アジア系文字列c:\test\皀皁皂皃的
、ロシア語文字列c:\test\абвгд
、混合文字列c:\test\test_皀皁皂皃的
、c:\test\test_абвгд
、c:\test\test_皀皁皂皃的_абвгд
をテストしました。すべての文字列に対して、有効なUTF8表現を受け取ります。
可能な重複UTF-8でエンコードされた文字列へのwstring](http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8) – IInspectable
@IInspあなたはあなたが言及したページを読んだ後にこの質問を投稿しました)))そのページの私の質問に対する明確な答えが表示されない –
[this](http://stackoverflow.com/a/12903901/1889329)質問? [コメント](http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8#comment32601904_12903901)*「[t]彼がVS2012を使用している場合、Windows用の作品または後で "*。 – IInspectable