C++将UTF-8编码的文件转化为GB2312编码

C++将UTF-8编码的文件转化为GB2312编码

  • 我需要对一个html网页进行解析,html是使用UTF-8编码的。但是,我使用的visual Studio 19是使用gb2312进行编码的。当读入html文件并在控制台上输出时,中文自然全部变成了乱码

  • 所以,需要通过某些操作,对读入的字符串进行转化,将UTF-8编码转为GB2312编码

  • 在网上看了很多文章,都没有解决问题,或者过于复杂,或者年代久远编译器不再支持。

  • 以下代码可直接解决问题

char* Utf8ToGb2312(char *p)                                               //unicode转国标
{
    DWORD dwNum = MultiByteToWideChar(CP_UTF8,0,p,-1,NULL,0);
    char *psText;                                                         //存储文件名
    wchar_t *pwText=(wchar_t*)malloc(dwNum*sizeof(wchar_t));
    dwNum = MultiByteToWideChar(CP_UTF8,0,p,-1,pwText,dwNum);
    dwNum = WideCharToMultiByte(CP_ACP,0,pwText,-1,NULL,0,NULL,NULL);
    psText=(char*)malloc(dwNum*sizeof(char));
    dwNum = WideCharToMultiByte(CP_ACP,0,pwText,-1,psText,dwNum,NULL,NULL);
    free(pwText);
    return psText;
}
  • p为原字符串,返回转码后的新字符串
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用 Arduino 和 iconv 库将 UTF-8 编码转换GB2312 编码的示例代码: ```C++ #include <iconv.h> // 导入 iconv 库 #include <string.h> void setup() { Serial.begin(9600); // 初始化串口 } void loop() { String utf8Str = "你好,世界!"; // 声明一个 UTF-8 编码的字符串 char utf8Buf[32]; utf8Str.toCharArray(utf8Buf, utf8Str.length() + 1); // 将 UTF-8 字符串转换为字符数组 char gb2312Buf[32]; size_t utf8Len = strlen(utf8Buf); size_t gb2312Len = sizeof(gb2312Buf); iconv_t cd = iconv_open("GB2312", "UTF-8"); // 打开转换句柄 iconv(cd, &utf8Buf, &utf8Len, &gb2312Buf, &gb2312Len); // 进行转换 iconv_close(cd); // 关闭转换句柄 String gb2312Str = String(gb2312Buf); // 将 GB2312 编码的字符数组转换为字符串 Serial.println(gb2312Str); // 输出转换后的字符串 delay(1000); } ``` 在上面的代码中,我们首先使用 `String` 类型声明了一个 UTF-8 编码的字符串,并将其转换为字符数组。接着,我们声明了一个长度为 `32` 的字符数组 `gb2312Buf`,用于存储转换后的 GB2312 编码。然后,我们使用 `iconv_open` 函数打开一个转换句柄,并使用 `iconv` 函数进行转换。最后,我们使用 `String` 类型将转换后的字符数组转换为字符串,并输出到串口。 需要注意的是,上述示例代码中的 GB2312 编码字符数组长度为 `32`,如果转换后的字符串长度超过 `32`,则可能会导致内存溢出。因此,在实际应用中,需要根据转换后的字符串长度来动态分配内存,以避免内存溢出的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值