首页 > 其他分享 >从 UTF-8 编码到 GBK 编码的转换,解决中文在日志里显示乱码

从 UTF-8 编码到 GBK 编码的转换,解决中文在日志里显示乱码

时间:2024-08-01 11:20:03浏览次数:15  
标签:编码 UTF get len 乱码 wstr str 缓冲区 NULL

从 UTF-8 编码到 GBK 编码的转换,通过中间步骤先将 UTF-8 转换为宽字符,再将宽字符转换为 GBK。

std::string Utf8ToGbk(const std::string& utf8)
{
    int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);
    std::unique_ptr<wchar_t[]> wstr(new wchar_t[len + 1]);
    memset(wstr.get(), 0, (len + 1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, wstr.get(), len);
    len = WideCharToMultiByte(CP_ACP, 0, wstr.get(), -1, NULL, 0, NULL, NULL);
    std::unique_ptr<char[]> str(new char[len + 1]);
    memset(str.get(), 0, (len + 1) * sizeof(char));
    WideCharToMultiByte(CP_ACP, 0, wstr.get(), -1, str.get(), len, NULL, NULL);
    return std::string(str.get());
}

 

  1. 计算转换为宽字符(宽字节)所需的缓冲区大小:

    int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);

    这里使用 MultiByteToWideChar 函数计算将 UTF-8 编码的字符串 utf8 转换为宽字符(wchar_t)所需的缓冲区大小。CP_UTF8 指定了源字符串的编码格式是 UTF-8。utf8.c_str() 返回指向字符串内容的指针。-1 表示处理到字符串的结尾(包括终止符)。NULL 和 0 表示只返回所需缓冲区大小。

  2. 分配宽字符缓冲区:

    std::unique_ptr<wchar_t[]> wstr(new wchar_t[len + 1]); memset(wstr.get(), 0, (len + 1) * sizeof(wchar_t));

    使用 std::unique_ptr 智能指针动态分配一个宽字符缓冲区,大小为 len + 1,以确保有足够的空间存储转换后的宽字符字符串以及终止符。memset 函数将缓冲区初始化为 0。

  3. 将 UTF-8 编码的字符串转换为宽字符字符串:

    MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, wstr.get(), len);

    再次调用 MultiByteToWideChar 函数,将 UTF-8 编码的字符串转换为宽字符字符串,并存储在 wstr 缓冲区中。

  4. 计算转换为多字节(GBK)所需的缓冲区大小:

    len = WideCharToMultiByte(CP_ACP, 0, wstr.get(), -1, NULL, 0, NULL, NULL);

    使用 WideCharToMultiByte 函数计算将宽字符字符串转换为多字节(GBK)所需的缓冲区大小。CP_ACP 表示使用系统默认的 ANSI 代码页(通常是 GBK)。

  5. 分配多字节缓冲区:

    std::unique_ptr<char[]> str(new char[len + 1]); memset(str.get(), 0, (len + 1) * sizeof(char));

    使用 std::unique_ptr 智能指针动态分配一个多字节缓冲区,大小为 len + 1memset 函数将缓冲区初始化为 0。

  6. 将宽字符字符串转换为多字节(GBK)字符串:

    WideCharToMultiByte(CP_ACP, 0, wstr.get(), -1, str.get(), len, NULL, NULL);

    再次调用 WideCharToMultiByte 函数,将宽字符字符串转换为多字节(GBK)字符串,并存储在 str 缓冲区中。

  7. 返回转换后的字符串:

    return std::string(str.get());

    将 str 缓冲区中的内容转换为 std::string 并返回。

标签:编码,UTF,get,len,乱码,wstr,str,缓冲区,NULL
From: https://www.cnblogs.com/mengyaoli/p/18336266

相关文章

  • 将 HTTP 分块编码数据流代码片段从 Node.js 转换为 Python
    我有一个Node.js客户端代码,它将请求发送到HTTP服务器,然后连续接收分块编码数据。这是带有一些流量数据输出的Node.js代码。consthttp=require('http');constoptions={hostname:'...',path:'...',port:...,...};constreq=http.request(......
  • 关于使用C#注入C++的封装DLL后打印内容乱码
    最近因需要,用C++写了个钩子的DLL,一切工作测试通过后,放到C#里使用P/Invoke调用,发现部分乱码,最后反复测试,才发现一个问题,原来SetWindowsHookEx这个函数,也是分A版和W版,最后换了就正常了,附上对比。。乱码[DllImport("user32.dll",SetLastError=true]publicstaticex......
  • 有谁知道如何在 ROS 中使用 python 开发赛车模拟编码?
    在模拟中,主要目标是让自动驾驶汽车读取AprilTags并根据标牌提供的说明进行导航。AprilTags是一种基准标记,可作为重要的视觉提示,传达有关汽车周围环境的信息,例如方向、速度限制和其他关键路标。汽车的车载视觉系统应该检测这些标签,解码嵌入的数据,并相应地调整其运动。这包括在......
  • Linux 使用unzip解压乱码
    unzip解压乱码问题 unzip软件包的unzip命令提供了-O参数(以及-I参数),可以指定编码。 -OCHARSET为DOS,Windows和OS/2归档文件指定字符编码-ICHARSET为UNIX和其他归档文件指定字符编码 可以使用下面的命令进行解压,即制定字符编码集unzip-Ogb18030***.zip ......
  • Unicode编码详细介绍
    Unicode是一个国际标准,用于为世界上几乎所有的字符和文本符号提供一个唯一的数字标识。它旨在解决传统的字符编码方案中存在的多种问题,比如字符集不兼容、编码冲突等。Unicode允许计算机以一种统一的方式处理、存储和交换文本数据,无论这些数据是使用哪种语言或符号系统。Unico......
  • 智能编码助手都在卷什么?投喂你的代码库,让【文心快码】帮你解读!
    越来越普遍的AI绘画、视频、小说等AIGC内容渗入生活的方方面面,超高的生成速度引发大量从业者为自己的饭碗而感到“压力山大”。在办公越来越讲究提效的当下,为了让自己的编码提速、提质,要么“鸡娃不如鸡自己”,硬生生练就键盘上的“佛山无影手”;要么“开点科技”,比如使用各路智......
  • 在编码过程中将正确的括号放在正确的位置
    在下面的计算机代码中插入圆括号,使变量x的值对应于以下公式:importmathx=math.sqrt(1535)+3/1-math.exp(-2)**2%336030/345importmath#Calculatetheinnerterm(underthesquareroot)inner_term=math.sqrt(1535)+3/(1-math.exp(-2))#Squa......
  • 【编码技巧】总结一个稳定而高效的方法,将二维关系数据转换为树形结构
        产品或项目开发过程中,经常遇到一些存在上下级关系的树形结构,但在数据库中存储为二维表关系数据的情况。而前端树形控件又要求按照树形层级组织数据,这就存在一个平铺的关系数据转换为树形层级结构的典型问题。    表结构及二维数据示例(以id,parentid自关联为例):......
  • QT 中文字符报错乱码 C2001
    由于工作限制QT只能用很早的版本,学QT的时候,使按钮显示字符setText中放入中文字符,编译时报错 网上查了很多方法,主要是字符编码不一致的问题,这里总结一下首先查一下编码是不是UTF-8上方菜单栏中点击工具,在下拉列表里点击选项 在弹出的选项窗口中,进入文本编辑器->行为界面......
  • 来自 PyArrow ChunkedArray 的虚拟编码 PyArrow 表,无需通过 pandas?
    假设我importpyarrowaspaca=pa.chunked_array([['a','b','b','c']])print(ca)<pyarrow.lib.ChunkedArrayobjectat0x7fc938bcea70>[["a","b","b","......