簡體   English   中英

使用std :: codecvt_xxx將C ++ std :: wstring轉換為utf8

[英]Converting C++ std::wstring to utf8 with std::codecvt_xxx

C ++ 11具有將寬字符串std::wstring從/轉換為utf8表示的工具: std::codecvtstd::codecvt_utf8std::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM