回覆列表
  • 1 # 使用者7281654453606

    C++11的std::wstring_convert配合std::codecvt模板類完全可以解決這個問題,不會出現@vczh 所說修改了全域性locale會導致汙染其他庫的問題。這兩個模板類的功能是:std::wstring_convert:轉碼器,接收一個類似codecvt描述編碼轉換特性的模板引數,用於將本地化的寬字元wstring和指定編碼的位元組化string進行互轉。std::codecvt:編碼轉換特性類,用在wstring_convert的模板引數中來指定使用哪種編碼。所以編碼A和B互轉的實現方式就是:藉助本地化寬字串,先將以A編碼的string轉為本地化的wstring,再將本地化的wstring轉為B編碼後的string。codecvt一般使用下面兩個特化子類:std::codecvt_utf8<wchar_t>:用於UTF8和本地化wchar_t的互轉std::codecvt_byname<wchat_t, char, std::mbstate_t>:用於其他編碼(例如GBK)和本地化wchar_t的互轉,類的建構函式需要傳入編碼的locale name,由於編碼的locale name是作業系統決定的(例如GBK在linux下的locale名可能是"zh_CN.GBK",而windows下是".936"),因此做跨平臺的話仍然要給不同的系統做適配。這裡給一個windows下,GBK string轉UTF8 string的例子:首先將GBK string轉wstring

    再將wstring轉為UTF8 string轉碼就完成了。utf8_str裡的內容應該是"\xE7\x83\xAB"(燙的UTF8)。

  • 中秋節和大豐收的關聯?
  • 貓懷孕要幾個月才生?