Scheint, dass std::codecvt_utf8
funktioniert gut für die Konvertierung std::wstring
->utf8
. Es hat alle meine Tests bestanden. (Windows app, Visual Studio 2015, Windows 8 mit EN locale)
Ich brauchte einen Weg, um Dateinamen in UTF8 zu konvertieren. Daher geht es bei meinem Test um Dateinamen.
In meiner App verwende ich boost::filesystem::path
1.60.0, um mit Dateipfad umzugehen. Es funktioniert gut, aber nicht in der Lage, Dateinamen in UTF8 richtig zu konvertieren. Intern Windows-Version von boost::filesystem::path
verwendet std::wstring
, um den Dateipfad zu speichern. Die Build-In-Konvertierung zu std::string
funktioniert leider nicht.
Testfall:
- erstellen Datei mit gemischten Symbolen
c:\test\皀皁皂皃的
(einige zufällige asiatischen Symbole)
- Scan dir mit
boost::filesystem::directory_iterator
, erhalten boost::filesystem::path
für die Datei
- wandeln es in der
std::string
über build-in Umwandlung filenamePath.string()
- erhalten Sie
c:\test\?????
. Asiatische Symbole wurden in "?" Umgewandelt. Nicht gut.
boost::filesystem
verwendet intern std::codecvt
. Es funktioniert nicht für die Konvertierung std::wstring
->std::string
.
Statt build-in boost::filesystem::path
Konvertierung können Sie Konvertierungsfunktion als dieser (original snippet) definieren:
std::string utf8_to_wstring(const std::wstring & str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
Dann können Sie Dateipfad zu UTF8 konvertieren leicht: utf8_to_wstring(filenamePath.wstring())
. Es funktioniert perfekt.
Es funktioniert für jeden Dateipfad. Ich testete ASCII-Zeichenfolgen c:\test\test_file
, asiatische Zeichenfolgen c:\test\皀皁皂皃的
, russische Zeichenfolgen c:\test\абвгд
, gemischte Zeichenfolgen c:\test\test_皀皁皂皃的
, c:\test\test_абвгд
, c:\test\test_皀皁皂皃的_абвгд
. Für jede Zeichenfolge erhalte ich eine gültige UTF8-Darstellung.
Mögliche Duplikat [Umrechnen wstring to string codiert in UTF-8] (http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8) – IInspectable
@IInnsp ectable Ich habe diese Frage gepostet, nachdem ich die Seite gelesen habe, die Sie erwähnt haben))) Ich sehe keine klare Antwort auf meine Frage auf dieser Seite –
Beantwortet [this] (http://stackoverflow.com/a/12903901/1889329) nicht Ihre Frage? Laut einem [Kommentar] (http://stackoverflow.com/questions/4358870/convert-wstring-to-string-encoded-in-utf-8#comment32601904_12903901) * "[t] arbeitet er für Windows, wenn Sie VS2012 verwenden oder später"*. – IInspectable