今天很有成就感,倒不是做出了多牛的东西,而是终于可以动态的进行编码的各种转换了。

其实这个用到的是网上一搜一大片的iconv,目前有windows版和linux版,linux下的很容易找到,直接装上就可以进行开发了,windows下的包可以通过这个链接下载:win-iconv-0.0.4.zip,直接将放入工程内,就可以使用了。

下面给出我自己的测试代码(基于文件的):

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include "include/iconv.h"using namespace std;int main(void)
{string src("");char buf[4096];int fileLen = 0;ifstream file1("sohu.htm");while(!file1.eof()){memset(buf, 0, 4096);file1.read(buf, 4096);             int readLen = file1.gcount();buf[readLen] = '\0';printf("readline: \n %s\n", buf);     src.append(buf);fileLen += readLen;}file1.close();char *dest = new char[src.length() * 2 + 1]; /* 格式化转换后的字串 */  memset(dest, 0, src.length() * 2 + 1);size_t src_len = src.length();  size_t dst_len = src.length() * 2;          //注意:我用了一块2倍于源数据长度的buffer const char *in = src.c_str();  char *out = dest;  iconv_t cd;cd = iconv_open("utf-8", "gb2312");         /* 将GB2312字符集转换为UTF-8字符集 */  if ((iconv_t)-1 == cd){  printf("iconv_open err %d\n", errno);return -1;  }  if(iconv(cd, &in, &src_len, &out, &dst_len) == -1) /* 执行转换 */ {  printf("iconv_open err %d\n", errno);return -1;  }  ofstream file2("out.txt");file2.write(dest, src.length() * 2 - dst_len);file2.close();iconv_close(cd); /* 执行清理 */  return 0;
}  

我在写代码的时候,遇到了两种错误:

(1)返回errno=7,即E2BIG

问题原因:目的内存的大小不够

解决办法:就是使用的分配2倍于源数据大小的空间,由于编码转换会导致数据量的变化

(2)返回errno=42,即ENOMSG

问题原因:源数据的编码与iconv_open输入的源编码不同

解决办法:就是找到源数据的真正编码,使用uchardet对字符串进行分析得出真正的编码格式

如何使用uchardet?

uchardet_t m_uchardet = uchardet_new();
if(m_uchardet)
{if(uchardet_handle_data(m_uchardet, m_content.c_str(), m_content.length()) == 0){uchardet_data_end(m_uchardet);m_charSet.assign(uchardet_get_charset(m_uchardet));}
}
uchardet_delete(m_uchardet);

uchardet源码下载路径:

BYVoid-uchardet-56a4c0d.zip

类似的,对内存中的数据进行编码转换也可以用这个方法,最终输出的文件编码格式就是当初设置的目标编码格式。

转载于:https://www.cnblogs.com/geekma/archive/2012/08/29/2662233.html

关于c++的文件编码的研究相关推荐

  1. python设置文件编码_python修改文件编码为utf-8格式

    原博文 2019-12-02 17:11 − 简单实现.h,.c文件修改编码为utf-8格式. import os; import chardet; file_path = "." ...

  2. 苹果官网证书文件,待研究

    苹果官网证书文件,待研究 http://www.apple.com/certificateauthority/   导读:MDM 证书申请流程(vendor及customer)整个流程分为两部分:ve ...

  3. 用Python chardet库来判断文件编码

    2019独角兽企业重金招聘Python工程师标准>>> 由于工作需要处理大量文件,在此之前需要统一文件编码.于是研究了一阵如何识别文件编码,转码这一过程相对简单,而识别确实个难题.由 ...

  4. linux下使用iconv转换编码,linux iconv 转换文件编码

    查看文件编码 file -i filename 递归转换(包括子文件夹) find default -type d -exec mkdir -p utf/{} \; find default -typ ...

  5. 文件编码H264编解码器性能测试

    最近应用开发的过程当中出现了一个小问题,顺便记载一下原因和方法--文件编码 H264编码器性能测试 如今,H264已经成为视频行业的标准规范,企业中应用比较多的当数X264,开源,资源消耗又比较少. ...

  6. shell 批量转换文件编码

    相信大家在平时的跨平台编程中碰到过文件编码问题,比如在Windows代码字符编码方式是GB2312,然而转到Linux却只支持utf-8,虽然对代码部分没啥影响,但是很多中文注释部分,却一片乱码,很让 ...

  7. linux下查看文件编码及修改编码

    linux下查看文件编码及修改编码 查看文件编码 在Linux中查看文件编码可以通过以下几种方式: 1.在Vim中可以直接查看文件编码 :set fileencoding 即可显示文件编码格式. 如果 ...

  8. linux 文件编码问题

    iconv -f UTF-8 -t gb18030 file_input -o file_output 上述命令不一定有用. 大概了解下文件编码,和vim里面的编码情况. 1 字符编码基础知识 字符编 ...

  9. Python读取文件编码及内容

    Python读取文件编码及内容 最近做一个项目,需要读取文件内容,但是文件的编码方式有可能都不一样.有的使用GBK,有的使用UTF8.所以在不正确读取的时候会出现如下错误: UnicodeDecode ...

最新文章

  1. PCL:点云特征描述子3D_object_recognition_(descriptors)
  2. 云南实现手机自主补(换)领居民身份证
  3. 关于node.js的进程管理
  4. python第三天(dictionary应用)转
  5. Alpha冲刺(8/10)
  6. 腾讯大数据高级产品总监洪桃李:决胜未来的4大关键能力
  7. apmserver导入MySQL_mysql数据库导入导出
  8. linux18.0.4安装mysql
  9. java中notify是什么意思_java中wait,notify,notifyAll是什么?
  10. 7-1 电话聊天狂人
  11. 慕课《如何写好科研论文》Quiz汇总
  12. 75 [backtrader期货策略]十大经典策略-分时均线交叉策略
  13. linux设置环境变量设置环境变量
  14. 安卓项目查手机电量功能_安卓手机如何查电池使用寿命
  15. 【ICPC模板】多元一次不定方程(丢番图方程)求解
  16. USB Type-C的基本原理
  17. 坚果pro2s android 8,坚果Pro2s和小米8se哪个好?坚果Pro2s对比小米8se区别评测
  18. 华为智慧屏s系列和v系列有什么区别?
  19. C#中的checked关键字和unchecked 关键字
  20. linux ubuntu麒麟下安装playframework和Intellij2016

热门文章

  1. 【杂谈】有三AI的一对一永久技术答疑服务,我们至少不会跑路
  2. 【通知】如何让你的2020年秋招CV项目经历更加硬核,可深入学习有三秋季划4大领域32个方向...
  3. 【知识星球】做作业还能赢奖金,传统图像/机器学习/深度学习尽在不言中
  4. 【图像分割模型】快速道路场景分割—ENet
  5. Visual C++设计UDP协议通讯示例
  6. mybatis-generator自动生成mapper
  7. 如何绘制漂亮的多序列比对图片
  8. 2016012090+小学四则运算练习软件项目报告
  9. 运行scrapy保存图片,报错ValueError: Missing scheme in request url: h
  10. app 性能优化的那些事(二)