本文主要是介绍C++ 利用标准库多字节转宽字节字符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在 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);}}
这篇关于C++ 利用标准库多字节转宽字节字符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!