iconv 判断字符编码_使用iconv进行编码gb2312转utf8 转码失败及解决

使用背景

项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和c++程序都默认使用多字节的编码方式,所以在传输前就需要对编码进行utf8的转换,而在接收处理的时候再转换成gb2312。

2a647fed4c59c448fccf18a5c7555ebc.png

问题

bug发生在一个文件路径上面,包含文件路径就会导致c++端无法解析,但是纯中文和英文及不同字符都没有问题,所以一开始未怀疑是编码问题,经过调试最终确定问题在iconv转码上,在转码的时候转换失败,导致返回结果为空。

分析

文件名为"1癵鰢⑷}·ˇ々.mp4",其中包含有特殊汉字和字符,猜测为字符集无法表示导致转码失败。

解决

网上查询确实存在该问题,建议将编码gb2312换成 gb18030 以支持更多字符。

原来的转码函数

std::string ConvertCode::gbk2utf8(const std::string& strGbk)

{

return code_convert("gb2312", "utf-8", strGbk);

}

转变以后测试正常

std::string ConvertCode::gbk2utf8(const std::string& strGbk)

{

return code_convert("gb18030", "utf-8", strGbk);

}

附iconv转变函数

std::string ConvertCode::code_convert(char *source_charset, char *to_charset, const std::string& sourceStr)

{

iconv_t cd = iconv_open(to_charset, source_charset);//获取转换句柄,void*类型

if (cd == 0)

return "";

size_t inlen = sourceStr.size();

if (inlen == 0)

return "";

size_t outlen = inlen*2+1;

const char* inbuf = (char*)sourceStr.c_str();

char* outbuf = (char*)malloc(outlen);

memset(outbuf, 0, outlen);

char *poutbuf = outbuf; //多加这个转换是为了避免iconv这个函数出现char(*)[255]类型的实参与char**类型的形参不兼容

if (iconv(cd, &inbuf, &inlen, &poutbuf, &outlen) == -1)

return "";

std::string strTemp(outbuf);//此时的strTemp为转换编码之后的字符串

iconv_close(cd);

return strTemp;

}

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 文件转码为txt utf-8 是指将一个文件的编码格式换为 UTF-8 编码,以便可以正确地在各种操作系统和软件中进行读取和处理。下面是实现这个转码过程的步骤: 1. 确定原始文件的编码格式:在转码之前,需要确定原始文件的编码格式。可以通过打开文件并查看文件属性或使用专门的工具来确定编码格式。 2. 创建一个新的空白文本文件:打开一个文本编辑器或记事本软件,并创建一个新的空白文本文件。 3. 打开原始文件:使用文本编辑器或记事本软件打开原始文件。 4. 将原始文件的内容复制到新文件中:选中原始文件中的所有内容,复制并粘贴到新的空白文件中。 5. 将新文件的编码格式设置为 UTF-8:在文本编辑器或记事本软件中,找到文件编码选项,并将它设置为 UTF-8。 6. 保存新文件:使用新的文件名保存新文件,确保文件后缀为 .txt。 7. 关闭原始文件和新文件:关闭原始文件和新文件,以确保更改保存。 8. 文件转码完成:经过上述步骤,原始文件已经成功转码为 UTF-8 编码的新文本文件。 通过这些步骤,我们可以将原始文件转码为 UTF-8 编码的 txt 文件,这样可以确保文件在不同操作系统和软件中的可读性和兼容性。 ### 回答2: 文件转码为UTF-8格式,可以使用各种文本编辑器或编程语言实现。下面以Python代码示例进行说明。 假设我们有一个名为input.txt的文本文件,编码为其他格式(例如GBK),我们希望将其转码为UTF-8格式,然后保存为output.txt。 首先,我们需要读取原始文件的内容。可以使用Python的open函数打开文件,并指定相应的编码格式,例如: ```python with open('input.txt', 'r', encoding='GBK') as f: content = f.read() ``` 然后,我们可以将读取到的内容以UTF-8编码进行编码使用encode方法即可实现: ```python content_utf8 = content.encode('utf-8') ``` 接下来,我们可以将编码后的内容写入新的文件output.txt中,同样使用open函数,并指定编码为UTF-8: ```python with open('output.txt', 'w', encoding='utf-8') as f: f.write(content_utf8.decode('utf-8')) ``` 以上代码将原始文件内容以UTF-8编码格式写入output.txt中,完成了文件的转码过程。 需要注意的是,在转码过程中,我们首先读取原始文件的内容时,要确保使用编码格式与实际格式一致;在写入编码后的内容时,也要确保所指定的编码格式与输出文件的要求一致。 以上就是将文件转码为UTF-8格式的过程,你可以根据实际需求进行相应的更改和调整。 ### 回答3: 文件转码为UTF-8是一种常见的操作,用于将文件的编码格式从其他编码换为UTF-8编码。UTF-8是一种通用的编码格式,能够支持几乎所有的字符和符号。 文件转码的过程可以通过多种方式完成,其中一种简单的方法是使用文本编辑软件。首先,打开需要转码的文件,然后选择“另存为”或者“导出”选项。在保存文件的对话框中,一般会出现编码格式的选项,选择UTF-8作为新的编码格式,然后保存文件即可。 除了使用文本编辑软件,还可以使用命令行工具进行文件转码。在命令行中,使用类似以下的命令可以实现文件转码: ``` iconv -f old_encoding -t utf-8 input_file -o output_file ``` 其中,old_encoding表示原始文件的编码格式,input_file表示需要转码的文件,output_file表示转码后保存的文件。 文件转码为UTF-8的过程可以处理多种文件类型,包括文本文件、代码文件、配置文件等。转码后,文件中的内容将会以UTF-8编码的形式进行存储,确保了文件的可读性和兼容性。 文件转码为UTF-8非常重要,因为UTF-8编码可以在不同的操作系统和平台上被广泛支持。同时,UTF-8编码也能够处理各种不同语言的字符和符号,确保了文件中内容的正确显示和处理。 综上所述,文件转码为UTF-8是一种常见的操作,可以使用文本编辑软件或者命令行工具实现。转码后的文件使用UTF-8编码,能够支持各种字符和符号,提高了文件的可读性和兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值