首页 > 编程语言 >C++ 处理字符串编码问题

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

时间:2023-02-02 19:11:29浏览次数:66  
标签:std 编码 const string len C++ str 字符串 ret

#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

标签:std,编码,const,string,len,C++,str,字符串,ret
From: https://www.cnblogs.com/hhddd-1024/p/17087159.html

相关文章

  • 代码随想录算法训练营Day2|977有序数组的平方 209.长度最小的子数组 59螺旋矩阵Ⅱ(C++)
     LeetCode刷题,代码随想录算法训练营Day2977.有序数组的平方 题目链接:977.有序数组的平方 题目思路:关键在于双指针思想的应用输入:nums=[-4,-1,0,3,10]输出:[0......
  • js 字符串常用的方法
    charAt(索引)获取索引位置的字符串toLowerCase()将字符串的所有字母转换为小写toUpperCase()将字符串的所有字母转换为大写replace(要被替换的内容,替换上去的内容)......
  • C++之智能指针
    一、为什么需要智能指针?如果在div()输入的b==0,那么就会抛出一个异常,被main()捕获,但是在Func()中new申请的资源就会因没释放而发生泄露问题,这是一种异常安全问......
  • C++ 树进阶系列之线段树和它的延迟更新
    1.前言线段树和树状数组有相似之处,可以用于解决区间类型的问题。但两者又各个千秋,树状数组本质是数组,有着树的形,可以借用树的一些概念。线段树是典型的二叉树结构,无论神......
  • C++中char*与string转换
    (1)char*转换为string:直接赋值即可chara[1024]="abcdefg";stringmm=a;(2)求char*(不包含\0)以及string的长度:strlen()函数cout<<"a.size:"<<strlen(a)<<endl;......
  • Python字符串如何转为bytes对象
    1,字符串转换byte字节指的是计算机上面用来表示存储值的一种计量单位,但是它放在python里面的话就是一种数据类型,这个数据类型的名称为bytes。可以将其看做是二进制字节格......
  • c++内置类型
    内置类型,由编译器规定,不在任何头文件中,分为三种主要类型:整型、浮点型和void。void类型void主要用于声明无返回值的函数、声明指向任意类型化数据的指针或用于以下类型的......
  • 常见编码规范
    命名规范命名长度命名的原则以准确达意为目标,其长度以遵循此原则为主,并且是越短越好。对于公认、熟知的词,可以在项目内部统一成缩写对于作用域较小的变量,可以使用较短......
  • 【八大数据排序法】插入排序法的图形理解和案例实现 | C++
    第十六章插入排序法:::hljs-center目录第十六章插入排序法●前言●认识算法●一、插入排序法是什么?1.简要介绍2.图形理解3.算法分析●二、案例实现1.......
  • 删除字符串中出现最少的字符
    实现一个方法,删除字符串中出现最少的字符,输入'aabcc',输入出'aacc',实现如下:先用map来把字符串里出现过的字符和这个字符出现过的个数存起来,{a:2,b:1,c:2},然后用Math.min求m......