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

相关推荐

  1. C++ 利用标准字节字节字符

    2024-05-12 18:02:05       29 阅读
  2. 前端:零字符

    2024-05-12 18:02:05       34 阅读
  3. Oracle之ORA-29275: 部分字节字符

    2024-05-12 18:02:05       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 18:02:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 18:02:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 18:02:05       82 阅读
  4. Python语言-面向对象

    2024-05-12 18:02:05       91 阅读

热门阅读

  1. LeetCode //C - 87. Scramble String

    2024-05-12 18:02:05       31 阅读
  2. 马尔可夫链 学习笔记

    2024-05-12 18:02:05       31 阅读
  3. timestamp和datetime的区别

    2024-05-12 18:02:05       31 阅读
  4. 若依前端分离版-APP(UNI APP)表单添加验证

    2024-05-12 18:02:05       28 阅读
  5. GDB 使用python

    2024-05-12 18:02:05       36 阅读
  6. sql中的lag()和lead()是什么意思

    2024-05-12 18:02:05       36 阅读
  7. Go语言基础知识学习

    2024-05-12 18:02:05       26 阅读