[英]Converting C++ std::wstring to utf8 with std::codecvt_xxx
C ++ 11具有將寬字符串std::wstring
從/轉換為utf8表示的工具: std::codecvt
, std::codecvt_utf8
, std::codecvt_utf8_utf16
等。
Windows應用程序可以使用哪一個將常規寬字符串Windows字符串std::wstring
為utf8 std::string
? 它是否始終無法配置區域設置?
取決於你如何轉換它們。
您需要指定源編碼類型和目標編碼類型。
wstring
不是一種格式,它只是定義了一種數據類型。
現在通常當一個人說“Unicode”時,一個意味着UTF16
,這是Microsoft Windows使用的,這通常是wstring
包含的內容。
那么,從UTF8轉換為UTF16的正確方法:
std::string utf8String = "blah blah";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::wstring utf16String = convert.from_bytes( utf8String );
反過來說:
std::wstring utf16String = "blah blah";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> convert;
std::string utf8String = convert.to_bytes( utf16String );
並增加了混亂:
當你在Windows平台上使用std::string
時(比如當你使用多字節編譯時),它不是UTF8 。 他們使用ANSI 。
更具體地說,是Windows正在使用的默認編碼語言。
另請注意, wstring與UTF-16不完全相同 。
在Unicode中編譯時,windows API命令需要以下格式:
命令A - 多字節 - ANSI
命令W - Unicode - UTF16
似乎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
掃描boost::filesystem::directory_iterator
,獲取boost::filesystem::path
filenamePath.string()
將其轉換為std::string
c:\\test\\?????
。 亞洲符號轉換為'?'。 不好。 boost::filesystem
內部使用std::codecvt
。 它不適用於轉換std::wstring
- > std::string
。
您可以將轉換函數定義為此( 原始代碼段 ),而不是內置boost::filesystem::path
轉換:
std::string utf8_to_wstring(const std::wstring & str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
然后您可以輕松地將filepath轉換為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表示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.