C语言字符编码处理
2015-06-19 22:00
323 查看
一、字符编码识别
1、简介
uchardet是一个开源的用于文本编码检测的C语言库,其功能模块是用C++实现的,通过一定数量的字符样本独立的分析出文本的编码,当前已经支持UTF-8/GB13080/BIG5等共30多种编码。
参考:
2、安装
1、简介
uchardet是一个开源的用于文本编码检测的C语言库,其功能模块是用C++实现的,通过一定数量的字符样本独立的分析出文本的编码,当前已经支持UTF-8/GB13080/BIG5等共30多种编码。
参考:
https://www.byvoid.com/zhs/blog/encoding-autodetector-uchardet/
2、安装
https://github.com/BYVoid/uchardet http://www.filewatcher.com/m/uchardet_0.0.1.orig.tar.gz.179207-0.html[/code]
3、实例
example1.c#include <stdio.h> #include <uchardet/uchardet.h> /* 样本数量 */ #define NUMBER_OF_SAMPLES (2048) int main(int argc, char* argv[]) { FILE* file; char buf[NUMBER_OF_SAMPLES]; int len; uchardet_t ud; /* 打开被检测文本文件,并读取一定数量的样本字符 */ file = fopen("gb18030.txt", "rt"); len = fread(buf, sizeof(char), NUMBER_OF_SAMPLES, file); fclose(file); /* 通过样本字符分析文本编码 */ ud = uchardet_new(); if(uchardet_handle_data(ud, buf, len) != 0) /* 如果样本字符不够,那么有可能导致分析失败 */ { printf("分析编码失败!\n"); return -1; } uchardet_data_end(ud); printf("文本的编码方式是%s。\n", uchardet_get_charset(ud)); /* 获取并打印文本编码 */ uchardet_delete(ud); return 0; }
编译g++ -g -o example1 example1.c -I../src -L../src -static -luchardet
运行
二、字符编码转换
1、简介
由于历史原因,国际化的文字常常由于语言或者国家的原因使用不同的编码。libiconv库为需要做转换的应用提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。
2、安装http://www.gnu.org/software/libiconv/
3、API
iconv函数族有三个函数,原型如下:iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。
4、实例
参考:http://www.linuxidc.com/Linux/2014-11/109066.htm http://www.cnblogs.com/lancidie/archive/2013/04/12/3016965.html[/code]
example1.c#include<stdio.h> #include <string.h> #include <iconv.h> int ChangeCode( const char* pFromCode, const char* pToCode, const char* pInBuf, size_t* iInLen, char* pOutBuf, size_t* iOutLen ); int main( int argc, char* argv[] ) { char sInBuf[100]; char sOutBuf[100]; size_t iInLen = 0; size_t iOutLen = 100; int iRet; strcpy( sInBuf, "测试 Test Source" ); puts(sInBuf); memset( sOutBuf, 0x00, 100 ); iInLen = strlen( sInBuf ); iRet = ChangeCode( "GBK", "UTF-16", sInBuf, &iInLen, sOutBuf, &iOutLen ); puts(sOutBuf); iRet = ChangeCode( "UTF-16", "GBK", sOutBuf, &iOutLen , sOutBuf, &iOutLen ); puts(sOutBuf); return 0; } int ChangeCode( const char* pFromCode, const char* pToCode, const char* pInBuf, size_t* iInLen, char* pOutBuf, size_t* iOutLen ) { int iRet; //打开字符集转换 iconv_t hIconv = iconv_open( pToCode, pFromCode ); if ( -1 == (int)hIconv ) { return -1;//打开失败,可能不支持的字符集 } //开始转换 iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen ); //关闭字符集转换 iconv_close( hIconv ); return iRet; }
编译gcc -g -o example1 example1.c -liconv
运行
相关文章推荐
- C语言一个栈的实现
- c++抽象类
- C++标准库学习笔记-5-(Container)
- C++ 记录Windows程序崩溃时的dumpfile
- static和extern关键字
- c++动态绑定、静态绑定与java中动态绑定与静态绑定的比较
- C语言语法
- java中使用c++编程
- HDU-1050-Moving Tables(C++ && 贪心初步)
- 黑马程序员——C语言基础知识整理——关键字、标示符与注释
- 小波变换 C++ opencv 实现
- Windows下,Netbeans使用C++的配置方法
- c++map的用法
- C语言回顾(二、顺序程序及大数相加)——iOS开发基础
- c++map的用法 分类: POJ 2015-06-19 18:36 11人阅读 评论(0) 收藏
- C++陪我走过的一年
- C++ 类的大小计算
- 在C#中使用C++编写的类
- C++笔记整理
- 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)