一、字符编码识别

1、简介

uchardet是一个开源的用于文本编码检测的C语言库,其功能模块是用C++实现的,通过一定数量的字符样本独立的分析出文本的编码,当前已经支持UTF-8/GB13080/BIG5等共30多种编码。

参考:

2、安装

3、实例

example1.c

  1. #include <stdio.h>
  2. #include <uchardet/uchardet.h>
  3.  
  4. /* 样本数量 */
  5. #define NUMBER_OF_SAMPLES (2048)
  6.  
  7. int main(int argc, char* argv[])
  8. {
  9. FILE* file;
  10. char buf[NUMBER_OF_SAMPLES];
  11. int len;
  12. uchardet_t ud;
  13.  
  14. /* 打开被检测文本文件,并读取一定数量的样本字符 */
  15. file = fopen("gb18030.txt", "rt");
  16. len = fread(buf, sizeof(char), NUMBER_OF_SAMPLES, file);
  17. fclose(file);
  18.  
  19. /* 通过样本字符分析文本编码 */
  20. ud = uchardet_new();
  21. if(uchardet_handle_data(ud, buf, len) != 0) /* 如果样本字符不够,那么有可能导致分析失败 */
  22. {
  23. printf("分析编码失败!\n");
  24. return -1;
  25. }
  26. uchardet_data_end(ud);
  27. printf("文本的编码方式是%s。\n", uchardet_get_charset(ud)); /* 获取并打印文本编码 */
  28. uchardet_delete(ud);
  29.  
  30. return 0;
  31. }

编译

  1. g++ -g -o example1 example1.c -I../src -L../src -static -luchardet

运行

二、字符编码转换

1、简介

由于历史原因,国际化的文字常常由于语言或者国家的原因使用不同的编码。libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。

2、安装

3、API

iconv函数族有三个函数,原型如下:

  1. iconv_t iconv_open(const char *tocode, const char *fromcode);

此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。

  1. size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);

此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。

  1. int iconv_close(iconv_t cd);

此函数用于关闭转换句柄,释放资源。

4、实例

参考:

example1.c

  1. #include<stdio.h> #include <string.h>
  2. #include <iconv.h>
  3.  
  4. int ChangeCode( const char* pFromCode,
  5. const char* pToCode,
  6. const char* pInBuf,
  7. size_t* iInLen,
  8. char* pOutBuf,
  9. size_t* iOutLen );
  10.  
  11. int main( int argc, char* argv[] )
  12. {
  13. char sInBuf[100];
  14. char sOutBuf[100];
  15. size_t iInLen = 0;
  16. size_t iOutLen = 100;
  17. int iRet;
  18. strcpy( sInBuf, "测试 Test Source" );
  19. puts(sInBuf);
  20.  
  21. memset( sOutBuf, 0x00, 100 );
  22. iInLen = strlen( sInBuf );
  23. iRet = ChangeCode( "GBK", "UTF-16", sInBuf, &iInLen, sOutBuf, &iOutLen );
  24. puts(sOutBuf);
  25. iRet = ChangeCode( "UTF-16", "GBK", sOutBuf, &iOutLen , sOutBuf, &iOutLen );
  26. puts(sOutBuf);
  27. return 0;
  28. }
  29.  
  30. int ChangeCode( const char* pFromCode,
  31. const char* pToCode,
  32. const char* pInBuf,
  33. size_t* iInLen,
  34. char* pOutBuf,
  35. size_t* iOutLen )
  36. {
  37. int iRet;
  38. //打开字符集转换
  39. iconv_t hIconv = iconv_open( pToCode, pFromCode );
  40. if ( -1 == (int)hIconv )
  41. {
  42. return -1;//打开失败,可能不支持的字符集
  43. }
  44. //开始转换
  45. iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen );
  46. //关闭字符集转换
  47. iconv_close( hIconv );
  48. return iRet;
  49. }

编译

  1. gcc -g -o example1 example1.c -liconv

运行

C语言字符编码处理的更多相关文章

  1. C语言:字符编码

    C语言是 70 年代的产物,那个时候只有 ASCII,各个国家的字符编码都还未成熟,所以C语言不可能从底层支持 GB2312.GBK.Big5.Shift-JIS 等国家编码,也不可能支持 Unico ...

  2. C语言-字符编码转换:UTF与GB2312

    依赖库libiconv,libiconv库的交叉编译不做描述,网上很多 #include <stdio.h> #include <stdlib.h> #include < ...

  3. HTML语言字符编码

    ! ! — 惊叹号Exclamation mark ” " " 双引号Quotation mark # # — 数字标志Number sign $ $ — 美元标志Dollar s ...

  4. day 08字符编码 文件处理

    字符编码1.软件启动流程(打开notepad++文档)从硬盘将软件加载到内存上加载test.txt到内存中执行notepad++的代码,将test.txt打到屏幕上 python解释器也是一个应用软件 ...

  5. python基础之Day7part2 史上最清晰字符编码理解

    二.字符编码 基础知识: 文本编辑器存取文件原理与py执行原理异同: 存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘 取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内 ...

  6. 操作系统和程序设计语言的API使用的字符编码分析

     1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...

  7. Swift3.0语言教程删除字符与处理字符编码

    Swift3.0语言教程删除字符与处理字符编码 Swift3.0语言教程删除字符 Swift3.0语言教程删除字符与处理字符编码,在字符串中,如果开发者有不需要使用的字符,就可以将这些字符删除.在NS ...

  8. 【miscellaneous】【C/C++语言】UTF8与GBK字符编码之间的相互转换

    UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 CChineseCode 一 预备知识 1,字符:字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值." ...

  9. python学习笔记(基础一:'hello world'、变量、字符编码)

    第一个python程序: Hello World程序 windows命令行中输入:python,进入python交互器,也可以称为解释器. print("Hello World!" ...

随机推荐

  1. 记一次git fatal: Unable to find remote helper for 'https'问题的解决

    登陆到远程linux服务器上,使用git, clone的时候报“fatal: Unable to find remote helper for 'https'”错,没管,绕过,使用git clone ...

  2. BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 2354  Solved: 826[Submit][Status][Discuss ...

  3. bzoj 4177 Mike的农场

    bzoj 4177 Mike的农场 思维有些江化了,一上来就想费用流做法,但其实就是个最小割啊. 考虑先将所有的收益拿到,再减去不能拿的以及三元组 \((i,j,k)\) 产生的代价.即,先让 \(a ...

  4. JS 实战1(添加、删除)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...

  5. 【Python】matplotlib 双y轴绘制及合并图例

    1.双y轴绘制 关键函数:twinx() 问题在于此时图例会有两个. # -*- coding: utf-8 -*- import numpy as np import matplotlib.pypl ...

  6. Maven管理SSM框架的pom.xml文件配置(自己主动下载所依赖的jar包)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/25403855 <project xml ...

  7. 说说 PADS Layout 中的第 20 层和 第 25层

    说说 PADS Layout 中的第 20 层和 第 25层 PADA Layout 有一个不成文的说明,第 20 层和第 25 层各有各的用途. 第 20 层是 Placement Outline ...

  8. linux之 ssh连接服务器,WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    [root@zk01 ~]# ssh localhost@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: RE ...

  9. python set集合运算(交集,并集,差集,对称差集)

    1>交集>>> x={1,2,3,4}>>> y={3,4,5,6}>>> xset([1, 2, 3, 4])>>> y ...

  10. CentOS 6.5 下HeartBeat的安装与配置

    CentOS 6.5 下HeartBeat的安装与配置 参考网站: http://wenku.baidu.com/link?url=BvqJatdx1m12PLil-7YA1zkM0yUOEO8OnN ...