一、字符编码识别

1、简介

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

参考:

2、安装

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、安装

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、实例

参考:

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语言字符编码处理的更多相关文章

  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. HDU2870 最大窗口面积(单调队列优化)

    HDU1506 HDU2870 HDU4328 以前做的是单调队列的方法,现在试一试DP 注意的是对于i,向左延伸的L[i]到i不一定是单调的,比如1 3 2 1 2,对于i=4,L[i]=1而是2所 ...

  2. C语言 scanf()和gets()函数的区别

    C语言 scanf()和gets()函数的区别 1.相同点:scanf( )函数和gets( )函数都可用于输入字符串 2.不同点:两者在功能上有所区别,具体区别如下: 要实现如下需求“从控制台输入字 ...

  3. HTML表单 在提交之前 验证表单数字合法性

    function checkform(){ if(!isNumeric($('.apply_money').val())){ alert("必须是数字"); return fals ...

  4. 使用ndk-stack来查找崩溃

    logcat报错 Fatal signal 6 (SIGABRT) at 0x000025c9 (code=-6), thread 9703 (Thread-1277) 都是一些寄存器以及函数地址,真 ...

  5. IE9 下面, XMLHttpRequest 是不支持跨域请求的解决方法

    在 IE9 下面, XMLHttpRequest 是不支持跨域请求的. IE10 的 XMLHttpRequest 支持跨域, 而 IE8, IE9 需要使用 XDomainRequest 来实现跨域 ...

  6. 黄聪:WordPress 多站点建站教程(二):后台(管理网络)设置详解,如何管理子站的用户、主题、插件、设置等功能

    建立好了子站,我们需要有个地方配置所有子站的主题.插件等功能,我们可以在后台看到 我的站点--管理网络 如下图: 在 管理网络--仪表盘 里面,我们可以创新用户和站点,也提供了查询功能. 要注意的是: ...

  7. log4net 使用指南,最常遇到的问题整理。。。

    一.    Log4net特征    Log4net是一个用于.NET开发环境的日志记录组件,由于它的超快及超灵活,很多大型的应用都会用到.    它有如下特点:    1.自定义日志输出级别    ...

  8. HDU 4438 Hunters

    Hunters Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. 管理Linux服务器的用户和组(续篇)

    用户切换 新建用户 useradd命令的选项 设置用户口令 passwd命令的选项 chage命令 修改用户帐户 禁用和恢复用户帐户 禁用和恢复用户帐户- Passwd命令 禁用和恢复用户帐户-直接修 ...

  10. Linux-vim编辑器与shell的简介

    VIM编辑器  vi是Visual interface的简称,它可以执行输出.删除.查找.替换.块操作等众多文本操作. 用户可以根据自己的需要对vim进行定制,这是其他编辑程序所没有的. vim不是一 ...