C语言字符编码处理
一、字符编码识别
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语言字符编码处理的更多相关文章
- C语言:字符编码
C语言是 70 年代的产物,那个时候只有 ASCII,各个国家的字符编码都还未成熟,所以C语言不可能从底层支持 GB2312.GBK.Big5.Shift-JIS 等国家编码,也不可能支持 Unico ...
- C语言-字符编码转换:UTF与GB2312
依赖库libiconv,libiconv库的交叉编译不做描述,网上很多 #include <stdio.h> #include <stdlib.h> #include < ...
- HTML语言字符编码
! ! — 惊叹号Exclamation mark ” " " 双引号Quotation mark # # — 数字标志Number sign $ $ — 美元标志Dollar s ...
- day 08字符编码 文件处理
字符编码1.软件启动流程(打开notepad++文档)从硬盘将软件加载到内存上加载test.txt到内存中执行notepad++的代码,将test.txt打到屏幕上 python解释器也是一个应用软件 ...
- python基础之Day7part2 史上最清晰字符编码理解
二.字符编码 基础知识: 文本编辑器存取文件原理与py执行原理异同: 存/写:进入文本编辑器 写内容 保存后 内存数据刷到硬盘 取/读:进入文本编辑器 找到内容 从硬盘读到内存 notepad把文件内 ...
- 操作系统和程序设计语言的API使用的字符编码分析
1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...
- Swift3.0语言教程删除字符与处理字符编码
Swift3.0语言教程删除字符与处理字符编码 Swift3.0语言教程删除字符 Swift3.0语言教程删除字符与处理字符编码,在字符串中,如果开发者有不需要使用的字符,就可以将这些字符删除.在NS ...
- 【miscellaneous】【C/C++语言】UTF8与GBK字符编码之间的相互转换
UTF8与GBK字符编码之间的相互转换 C++ UTF8编码转换 CChineseCode 一 预备知识 1,字符:字符是抽象的最小文本单位.它没有固定的形状(可能是一个字形),而且没有值." ...
- python学习笔记(基础一:'hello world'、变量、字符编码)
第一个python程序: Hello World程序 windows命令行中输入:python,进入python交互器,也可以称为解释器. print("Hello World!" ...
随机推荐
- 记一次git fatal: Unable to find remote helper for 'https'问题的解决
登陆到远程linux服务器上,使用git, clone的时候报“fatal: Unable to find remote helper for 'https'”错,没管,绕过,使用git clone ...
- BZOJ2124: 等差子序列(树状数组&hash -> bitset 求是否存在长度为3的等差数列)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 2354 Solved: 826[Submit][Status][Discuss ...
- bzoj 4177 Mike的农场
bzoj 4177 Mike的农场 思维有些江化了,一上来就想费用流做法,但其实就是个最小割啊. 考虑先将所有的收益拿到,再减去不能拿的以及三元组 \((i,j,k)\) 产生的代价.即,先让 \(a ...
- JS 实战1(添加、删除)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...
- 【Python】matplotlib 双y轴绘制及合并图例
1.双y轴绘制 关键函数:twinx() 问题在于此时图例会有两个. # -*- coding: utf-8 -*- import numpy as np import matplotlib.pypl ...
- Maven管理SSM框架的pom.xml文件配置(自己主动下载所依赖的jar包)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/UP19910522/article/details/25403855 <project xml ...
- 说说 PADS Layout 中的第 20 层和 第 25层
说说 PADS Layout 中的第 20 层和 第 25层 PADA Layout 有一个不成文的说明,第 20 层和第 25 层各有各的用途. 第 20 层是 Placement Outline ...
- linux之 ssh连接服务器,WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
[root@zk01 ~]# ssh localhost@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: RE ...
- python set集合运算(交集,并集,差集,对称差集)
1>交集>>> x={1,2,3,4}>>> y={3,4,5,6}>>> xset([1, 2, 3, 4])>>> y ...
- CentOS 6.5 下HeartBeat的安装与配置
CentOS 6.5 下HeartBeat的安装与配置 参考网站: http://wenku.baidu.com/link?url=BvqJatdx1m12PLil-7YA1zkM0yUOEO8OnN ...