继我的前一篇文章《iconv用法,编码转换(一)》 后,补充如何识别一个字符数组里面的文本是否是utf8格式的方法,因为对于非utf8格式的文本也进行iconv()处理的话,会删除掉非utf8文本内容,因此调用iconv()函数前需进行字符集判断。方法如下:

使用int IsTextUTF8(const char* str,unsigned int  length);函数来识别是否为utf8类型:

[cpp] view plaincopy
  1. #include<iconv.h>
  2. #include<iostream>
  3. #include<fstream>
  4. using namespace std;
  5. int IsTextUTF8(const char* str,unsigned int  length);
  6. int main()
  7. {
  8. iconv_t cd = iconv_open("GBK","UTF-8");
  9. if(cd == (iconv_t)(-1))
  10. {
  11. cout<<"Failed";
  12. }
  13. else
  14. {
  15. cout<<"Success"<<endl;
  16. }
  17. ifstream fp("1.html");  //1.html为utf8编码格式的文件
  18. char * inbuf = new char[1000] ;
  19. string s;
  20. while(getline(fp,s))
  21. {
  22. inbuf = (char *)s.c_str();
  23. char * in = inbuf;
  24. char * outbuf = new char[1000];
  25. char * out = outbuf;
  26. size_t inlen = 1000;
  27. size_t outlen = 1000;
  28. int res = IsTextUTF8(in,s.size());
  29. if(res)
  30. {
  31. cout<<"是utf8格式";
  32. iconv(cd,&in,&inlen,&out,&outlen);
  33. }
  34. else
  35. {
  36. cout<<"不是utf8格式";
  37. outbuf = inbuf;
  38. }//iconv(cd,&in,&inlen,&out,&outlen);
  39. cout<<outbuf;
  40. }
  41. iconv_close(cd);
  42. return 0;
  43. }
  44. int IsTextUTF8(const char* str,unsigned int  length)
  45. {
  46. int i;
  47. unsigned long nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
  48. unsigned char chr;
  49. int bAllAscii=1; //如果全部都是ASCII, 说明不是UTF-8
  50. for(i=0;i<length;i++)
  51. {
  52. chr= *(str+i);
  53. if( (chr&0x80) != 0 ) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8,ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
  54. bAllAscii= 0;
  55. if(nBytes==0) //如果不是ASCII码,应该是多字节符,计算字节数
  56. {
  57. if(chr>=0x80)
  58. {
  59. if(chr>=0xFC&&chr<=0xFD)
  60. nBytes=6;
  61. else if(chr>=0xF8)
  62. nBytes=5;
  63. else if(chr>=0xF0)
  64. nBytes=4;
  65. else if(chr>=0xE0)
  66. nBytes=3;
  67. else if(chr>=0xC0)
  68. nBytes=2;
  69. else
  70. {
  71. return 0;
  72. }
  73. nBytes--;
  74. }
  75. }
  76. else //多字节符的非首字节,应为 10xxxxxx
  77. {
  78. if( (chr&0xC0) != 0x80 )
  79. {
  80. return 0;
  81. }
  82. nBytes--;
  83. }
  84. }
  85. if( nBytes > 0 ) //违返规则
  86. {
  87. return 0;
  88. }
  89. if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
  90. {
  91. return 0;
  92. }
  93. return 1;
  94. }

iconv文件编码判断转换相关推荐

  1. html utf8转换工具,GB/BIG5/UTF-8 文件编码批量转换工具

    GB/BIG5/UTF-8 文件编码批量转换工具是一款单一文件与批量转换编码工具将 GB.BIG5.UTF-8 文件相互转换,方便的批量处理能力,主要用于网站文件编码方式的整体转换上. 某天, ...

  2. iconv 文件编码转换

    查了下iconv命令用法如下: iconv [选项...] [文件...] 有如下选项可用: 输入/输出格式规范: -f, --from-code=名称 原始文本编码 -t, --to-code=名称 ...

  3. 【转载】Java文件编码自动转换工具类

    本篇随笔主要介绍了一个用java语言写的将一个文件编码转换为另一个编码并不改变文件内容的工具类: 通过读取源文件内容,用URLEncoding重新编码解码的方式实现. 1 public class C ...

  4. python实现批量转换文件编码(批转换编码示例)

    这篇文章主要介绍了python实现批量转换文件编码示例,指定文件编码.目录或扩展名即可进行转换,大家参考使用吧 # -*- coding:utf-8 -*- __author__ = 'walksky ...

  5. iconv 文件编码转换--知网的情感字典数据

    背景: 下载了知网的情感字典数据,打开的时候是乱码,但是英文的字典数据是可以直接看的,很奇怪. 乱码形式如下: 原因 : 不知道上传文件的人用什么编码方式,mac默认了utf-8解码方式 解决: 问了 ...

  6. Linux下GBK文件编码批量转换UTF-8命令

    使用iconv 转换 Iconv语法:iconv -f encoding -t encoding inputfile 单个文件转换: $ iconv -f GBK -t UTF-8 file1 -o ...

  7. python3对文件编码的转换处理

    前言: 公司同事邀我一起给SQLSERVER 2008导数, 数据来源有高斯和ORACLE, 数据文件保存格式有UTF-8和GBK. 当我在做测试导入的时候发现SQLSERVER 2008数据库的WI ...

  8. 文件编码批量转换工具

    一.工具界面 二.使用说明 选择源文件路径和输出文件路径: 选择源文件编码格式和转换格式: 选择要转换的文件后缀类型: 点击转换按钮即可. 三.结果查看 四.下载 地址1(依赖64位JDK):http ...

  9. linux 字符集转换命令,Linux下GBK编码到UTF-8文件编码转换方法

    Linux命令行下查看看文件的编码 enca 文件名 Linux文件名编码批量转换 convmv -f 源编码 -t 新编码 [选项] 文件名 常用参数: -r 递归处理子文件夹 --notest 真 ...

最新文章

  1. guava-cache设计与实现
  2. CentOS7 配置ISCSI targetcli 共享存储
  3. [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
  4. 工作32:get之前打印
  5. 概率图模型更进一步的知识点
  6. Unity 图片开启不同选项内存占用
  7. 研究生量子计算机专业,量子计算机研究.PDF
  8. ios网络相关问题-HTTP特点
  9. Atitit 登录账号管理法passport 目录 1. 总则 1 1.1. 身份分类登录账号 管理员 操作人员 普通用户 1 1.2. 安全考虑,必须单独分开的账号储存表,使用不同等加密技术与秘
  10. jquery weui 上拉加载,下拉刷新,问题解答。
  11. Java链表——创建链表对象
  12. linux怎么用中文显示,linux中文显示设置
  13. SEO人员:如何预估SEO投资回报率?
  14. bin文件读写 - C/C++
  15. uniapp调用高德api
  16. python 微信自动回复_python微信机器人自动回复
  17. Java获取中文拼音、中文首字母缩写和中文首字母
  18. 【笔记】ARM指令系统
  19. 据说vite还是有坑,不行,那就还用vue-cli吧,命令vue create gua12,记一下,可能过一个星期不看,又忘了
  20. linux cnc 树莓派,谈谈LinuxCNC

热门文章

  1. 颜色传感器TCS230的使用
  2. 如何避免表单重复提交
  3. NEC使用C+L EDFA在超过1.1万公里的海底光缆中首次实现50Tb传输
  4. php纯面向过程--论坛
  5. 使用jquery实现的计算器功能
  6. SQLServer · 最佳实践 · RDS for SQLServer 2012权限限制提升与改善
  7. The Power of Ten – Rules for Developing Safety Critical Code
  8. openshift django目录结果
  9. Testing AJAX Applications with VSTS 2008
  10. 软件测试工程师面试英语