c++ iconv 字符utf-8转换gb2312失败

extern size_t iconv (iconv_t __cd, char **__restrict __inbuf,

size_t *__restrict __inbytesleft,

char **__restrict __outbuf,

size_t *__restrict __outbytesleft);

在使用iconv函数时,没有注意到输出缓冲区和长度剩余的意义,他们都会被修改的。

所以在传参数时,要对原来的输出缓冲区的值和长度保存outbytes,且outbytesleft是移动后的位置,转换的数据长度是原来数据大小 outbytes-outbytesleft。

转换测试代码

cpp 复制代码
std::string Utils::utf8_to_gbk(const std::string& utf8_str)
{
    size_t inbytes = utf8_str.length();
    size_t outbytes = inbytes * 2; // 初始估计,可能不够大
    size_t outbytes2 = outbytes;
    char* outbuf = (char*)malloc(outbytes);
    char *outbuf1 = outbuf;
//    memset(outbuf,1,outbytes);
    if (outbuf == nullptr)
        return ""; // 内存分配失败处理

    iconv_t cd = iconv_open("GBK", "UTF-8");
    if (cd == (iconv_t)-1) {
        free(outbuf);
        return ""; // iconv打开失败处理
    }

    char* inbuf = const_cast<char*>(utf8_str.c_str());
    memset(outbuf, 0, outbytes);
    size_t result = iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes);
    iconv_close(cd);

    if (result == (size_t)-1) {
        free(outbuf);
        return ""; // 转换失败处理
    }
    std::string gbk_str(outbuf1, outbytes2 - outbytes); // 注意这里可能需要调整,因为iconv可能不会在输出末尾添加null终止符
    free(outbuf1);
//    delete outbuf;
    return gbk_str;
}

之前错的代码是

std::string gbk_str(outbuf,outbytes);//这里就是空数据

free(outbuf);//这里就会挂

后来为了实现编码转换功能,使用的是qt的QTextCodec

测试代码,开发环境是linux的qt

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); //设置本地编码是utf-8

QString tmp = "畅行·泉城";//qt中的是unicode编码

qDebug() << "latin " << tmp.toLocal8Bit().toHex(); //utf-8

qDebug() << "latin " << tmp.toUtf8().toHex();//utf-8

size_t c_len = tmp.length();

QByteArray bb = tmp.toUtf8();

// len = bb.length();

std::string aa = tmp.toStdString();//std::string则是utf-8

// 获取UTF-8编解码器

QTextCodec *utf8Codec = QTextCodec::codecForName("UTF-8");

// 获取GBK编解码器

QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");

// 使用UTF-8编解码器将字符串从UTF-8解码为Unicode(QString)

QString unicodeString = utf8Codec->toUnicode(tmp.toUtf8());//这里其实不需要了,只要用下面的就行

// 然后使用GBK编解码器将Unicode字符串编码为GBK

QByteArray gbkByteArray = gbkCodec->fromUnicode(tmp);//qt中已经是unicode编码了

//QByteArray cc;

//cc.append(gbkByteArray);

qDebug() <<gbkByteArray <<"," <<gbkByteArray.toHex();

相关推荐
蹊黎3 小时前
C++中vector类的部分简单实现
开发语言·c++·visual studio
程序猿追9 小时前
kotlin-retry 接入鸿蒙后,怎样确认它真的会停止重试
开发语言·kotlin·harmonyos
我是人✓9 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
智能直播9 小时前
网络RTMP拉流不卡顿、声音不同步,一文讲透缓冲区、时间戳
开发语言·ffmpeg·php·音视频·视频编解码
墨云安全10 小时前
内网资产无法暴露到公网,怎么做安全检测?2026 年内网渗透测试的落地路径
开发语言·安全·网络安全·渗透测试·php
摇滚侠10 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y10 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
xier_ran10 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
jimy111 小时前
c++的 Type Traits (一)
开发语言·c++
别动我齐刘海12 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人