在 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);
}
}