C++ 处理字符串编码问题

#include <iostream>
#include <locale>
#include <codecvt>

std::string UnicodeToUTF8(const std::wstring &wstr) {
    std::string ret;
    try {
        std::wstring_convert<std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.to_bytes(wstr);
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}

std::wstring UTF8ToUnicode(const std::string &str) {
    std::wstring ret;
    try {
        std::wstring_convert<std::codecvt_utf8<wchar_t> > wcv;
        ret = wcv.from_bytes(str);
    } catch (const std::exception &e) {
        std::cerr << e.what() << std::endl;
    }
    return ret;
}

std::string UnicodeToANSI(const std::wstring &wstr) {
    std::string ret;
    std::mbstate_t state = {};
    const wchar_t *src = wstr.data();
    size_t len = std::wcsrtombs(nullptr, &src, 0, &state);
    if (static_cast<size_t>(-1) != len) {
        std::unique_ptr<char[]> buff(new char[len + 1]);
        len = std::wcsrtombs(buff.get(), &src, len, &state);
        if (static_cast<size_t>(-1) != len) {
            ret.assign(buff.get(), len);
        }
    }
    return ret;
}

std::wstring ANSIToUnicode(const std::string &str) {
    std::wstring ret;
    std::mbstate_t state = {};
    const char *src = str.data();
    size_t len = std::mbsrtowcs(nullptr, &src, 0, &state);
    if (static_cast<size_t>(-1) != len) {
        std::unique_ptr<wchar_t[]> buff(new wchar_t[len + 1]);
        len = std::mbsrtowcs(buff.get(), &src, len, &state);
        if (static_cast<size_t>(-1) != len) {
            ret.assign(buff.get(), len);
        }
    }
    return ret;
}

std::string UTF8ToANSI(const std::string &str) {
    return UnicodeToANSI(UTF8ToUnicode(str));
}

std::string ANSIToUTF8(const std::string &str) {
    return UnicodeToUTF8(ANSIToUnicode(str));
}

int main(int argc, char *argv[]) {
//    Unicode => UTF8
    std::wstring aa = L"你好!";
    std::string bb = UnicodeToUTF8(aa);
    std::cout << bb << std::endl;
//    UTF-8 => ANSI
    return 0;
}

参考:

C++中字符编码的转换(Unicode、UTF-8、ANSI)

std::wstring_convert处理UTF8

posted @     阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2021-02-02 一些配置模板
2021-02-02 Git常规操作
2021-02-02 vue2.x工程模板初始化
2021-02-02 Windows免安装版Redis
点击右上角即可分享
微信分享提示