将GBK转换成UTF8

将GBK转换成UTF8

string GBKToUTF8(const std::string& strGBK)
{
 string strOutUTF8 = "";
 WCHAR * str1;
 int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
 str1 = new WCHAR[n];
 MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
 n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
 char * str2 = new char[n];
 WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
 strOutUTF8 = str2;
 delete[]str1;
 str1 = NULL;
 delete[]str2;
 str2 = NULL;
 return strOutUTF8;
}

2、将UTF8转换成GBK

string UTF8ToGBK(const std::string& strUTF8)
{
 int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
 unsigned short * wszGBK = new unsigned short[len + 1];
 memset(wszGBK, 0, len * 2 + 2);
 MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUTF8.c_str(), -1, wszGBK, len);

 len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
 char *szGBK = new char[len + 1];
 memset(szGBK, 0, len + 1);
 WideCharToMultiByte(CP_ACP,0, wszGBK, -1, szGBK, len, NULL, NULL);
 //strUTF8 = szGBK;
 std::string strTemp(szGBK);
 delete[]szGBK;
 delete[]wszGBK;
 return strTemp;
}

在ARM架构的系统中,`iconv`函数确实可以用来做UTF-8到GBK或者其他编码间的换。然而,当你从GBK换回UTF-8时,尤其是对于较长的GBK文本,由于UTF-8是一种变长编码,有些GBK字符对应于多个UTF-8字节,这可能导致`iconv`函数的参数列表变得非常长,超过了系统的默认限制。 当`iconv`函数接收到的源数据不能完全放入单次调用的参数列表中时,就会抛出"Argument list too long"这样的错误。这是因为`iconv`函数一次只能处理一段有限长度的输入,而UTF-8到GBK的逆向换可能会生成比原始GBK文本更长的UTF-8序列。 为了解决这个问题,你需要将GBK数据拆分为较小的部分,然后逐个处理,或者使用循环遍历整个GBK文本,每次都调用`iconv`进行换,直到所有内容都被处理完毕。这可以通过使用循环和临时缓冲区来实现。 例如,你可以这样做: ```c char *gbk_data = ...; // GBK数据 size_t gbk_len = ...; // GBK数据长度 // 创建临时缓冲区和iconv上下文 char utf8_buffer[1024]; iconv_t conv = iconv_open("UTF-8", "GBK"); // 换方向 while (gbk_len > 0) { size_t to_convert = (gbk_len > sizeof(utf8_buffer)) ? sizeof(utf8_buffer) : gbk_len; size_t converted_bytes; if (iconv(conv, &gbk_data, &to_convert, utf8_buffer, &converted_bytes) == (size_t)-1) { // 处理错误,可能是因为超出了参数限制 } else { // 操作换后的utf8_buffer process_utf8(utf8_buffer, converted_bytes); // 更新gbk_data和gbk_len gbk_data += converted_bytes; gbk_len -= converted_bytes; } } // 关闭iconv上下文 iconv_close(conv); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值