在 C/C++ 之中,通常建議使用:mbstowcs (C語言函數庫)來實現多字節字符轉寬字節字符,這是因為如果使用。
?std::wstring_convert<std::codecvt_utf8<wchar_t>> 模板來實現,它可能導致程序崩潰的風險,如果字符集不是 utf8、或 unicode 字符時。
舉個例子:一些特殊的中文字符,可能沒法編譯為 unicode 字符,那么就會導致發生異常,而且必須是 utf8 編碼。
C/C++ 程序之中要使用中文,必須把編譯的執行字符集,通過編譯器指令更改為 utf8,否則就可能產生SEH結構化異常崩潰程序。
?
mbsmbstowcs、wcstombs 函數:
可通過:setlocale 設置地區函數影響
例如:
1、setlocale(LC_ALL, "zh-CN.UTF-8");
2、setenv("LANG","en_US.utf8",1);
C 庫函數 – setlocale() | 菜鳥教程 (runoob.com)
mbsmbstowcs、wcstombs 函數例子:
std::wstring Encoding::ascii_to_wstring2(const std::string& s) noexcept {std::size_t len = mbstowcs(NULL, s.data(), 0);if (len == 0 || len == std::string::npos) {return std::wstring();}ppp::vector<wchar_t> buf(len + 1);return std::wstring(buf.data(), mbstowcs(&buf[0], s.data(), buf.size()));}std::string Encoding::wstring_to_ascii(const std::wstring& s) noexcept {std::size_t len = wcstombs(NULL, s.data(), 0);if (len == 0 || len == std::string::npos) {return std::string();}ppp::vector<char> buf(len + 1);return std::string(buf.data(), wcstombs(&buf[0], s.data(), buf.size()));}
std::wstring_convert<std::codecvt_utf8<wchar_t>> 例子:
std::wstring Encoding::utf8_to_wstring(const std::string& s) noexcept {std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;try {return converter.from_bytes(s);}catch (const std::exception&) {return ascii_to_wstring2(s);}}std::string Encoding::wstring_to_utf8(const std::wstring& s) noexcept {std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;try {return converter.to_bytes(s);}catch (const std::exception&) {return wstring_to_ascii(s);}}