linux中iconv函数,Linux下编码转换(iconv函数族)

转自:http://www.linuxdiyf.com/viewarticle.php?id=45164

在Linux上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现(针对文件进行转换)

一、利用iconv函数族进行编码转换

iconv函数族的头文件是iconv.h

使用前需包含之:#include

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

(1) iconv_open()

函数原型:

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

函数功能:

该函数分配一个编码转换句柄

参数:

1> tocode是目标编码

2> fromcode是原编码

(具体可以使用的编码方案可以百度查找)

支持的内码包括:Unicode相关编码,如UTF-8、UTF-16等等;各国采用的ANSI编码,其中包括GB2312、BIG5等中文编码方式。

返回值:

调用成功,则该函数返回一个转换句柄,供以下两个函数使用;

调用失败,返回-1,并且设置errno

可能的错误类型:

EINVAL The  conversion  from fromcode to tocode is not supported by the implementation.

(2) iconv()

函数功能:进行实际的编码转换

函数原型:

size_t iconv(iconv_t cd,

char **inbuf, size_t *inbytesleft,

char **outbuf, size_t *outbytesleft);

参数介绍:

1> cd是方法iconv_open()调用返回的转码句柄;

2> inbuf指向需要转码的缓冲区;

3> inbytesleft是inbuf所保存的需要转码的字节数;

4> outbuf存放转码结果;

5> outbytesleft存放outbuf空间的大小。

(不足之处:由于没有办法获取转换之后需要的内存大小,所以会造成内存空间的浪费!)

返回值:

调用成功,返回转换的字节数(不可逆转调用的字节数,可逆转调用的字节数不包括在内)

调用失败,返回-1,并设置相应的errno。

注意:

iconv()是逐步扫描inbuf,每转换一个字符,就增加inbuf,减少inbytesleft,并将结果存入outbuf,结果字节数存入outbytesleft

常见的三种情况:

情况一: inbuf不为空,而且*inbuf也不为空

此时,进行正常的编码转换

遇到下列情况将停止扫描并返回:

(1)inbuf中碰到非法的多字节序

这种状况下,会设置errno为EILSEQ,并返回-1;

(2)inbuf字节被完全转换

这种状况下,返回转换的字节数

(3)inbuf中碰到不完整的多字节序

这种状况下,设置errno为EINVAL,并返回-1;

(4)outbuf中没有足够的空间以进行下一次的字符转换

这种状况下,设置errno为E2BIG,并返回-1;

情况二:inbuf == NULL,或者*inbuf == NULL;但outbuf != NULL,且*outbuf != NULL

iconv会设置转换状态为初始状态,并保存转换序列到*outbuf。如果outbuf空间不足,errno会设置为E2BIG,返回(size_t) (-1);

情况三:INBUF == NULL,或者*inbuf == NULL; 并且outbuf == NULL,*out == NULL

iconv设置转换状态为初始状态

(3) iconv_close()

函数原型:

int iconv_close(iconv_t cd);

函数功能:

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

示例代码:

封装一个转换类型:

class CCodeConverter

{

public:

CCodeConverter(const char * fromCode, const char * toCode)

{

hCodeConverter=iconv_open(toCode, fromCode);

}

~CCodeConverter()

{

iconv_close(hCodeConverter);

}

//进行转换

int convert(char * srcBuf, int srcLen, char * destBuf, int destLen)

{

//返回转换的字符个数

int nConv=iconv(hCodeConverter, &srcBuf, (size_t *)&srcLen, &destBuf, (size_t *)&destLen);

//如果错误,则获取错误码

nErr=errno;

return nConv;

}

//获取错误信息

int getErrInfo()

{

switch(nErr)

{

case E2BIG:

{

printf("errno:E2BGI(OutBuf空间不够)\n");

break;

}

case EILSEQ:

{

printf("errno:EILSEQ(InBuf多字节序无效)\n");

break;

}

case EINVAL:

{

printf("errno:EINVAL(有残留的字节未转换)\n");

break;

}

default:

break;

}

return nErr;

}

private:

//转换句柄

iconv_t hCodeConverter;

int nErr;

};

以utf-8转为utf-16为例

int main()

{

int srcLen=12;

char * srcBuf=new char[srcLen];

memset(srcBuf, 0, srcLen);

strcpy(srcBuf, "BaiSe");

int destLen=2*srcLen;

char * destBuf=new char[destLen];

memset(destBuf, 0, destLen);

CCodeConverter cv=CCodeConverter("utf-8", "utf-16");

int nRet=cv.convert(srcBuf, srcLen, destBuf, destLen);

if(nRet<0)

{

cv.getErrInfo();

return -1;

}

printf("转换成功\n");

}调试,查看内存,destBuf内容如下:

(gdb) print destBuf

$1 = 0x804b018 "\377\376B"

(gdb) print destBuf+1

$2 = 0x804b019 "\376B"

(gdb) print destBuf+2

$3 = 0x804b01a "B"

(gdb) print destBuf+3

$4 = 0x804b01b ""

(gdb) print destBuf+4

$5 = 0x804b01c "a"

(gdb) print destBuf+5

$6 = 0x804b01d ""

(gdb) print destBuf+6

$7 = 0x804b01e "i"

问题:不明白为什么前面有"\377\376",是用来标识编码类型的么?

二、iconv命令

iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。

用法: iconv [选项...] [文件...]

有如下选项可用:

输入/输出格式规范:

-f, --from-code=名称 原始文本编码

-t, --to-code=名称 输出编码信息:

-l, --list 列举所有已知的字符集输出控制:

-c 从输出中忽略无效的字符

-o, --output=FILE 输出文件

-s, --silent 关闭警告

--verbose 打印进度信息

-?, --help 给出该系统求助列表

--usage 给出简要的用法信息

-V, --version 打印程序版本号

例子:

iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt

这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下mips裸机编译,裸机交叉编译器输入

裸机交叉编译器的输入限制是什么…因为它不编译带有指针或mallocs的程序…或任何需要比底层硬件更多的东西….还有1如何找到这些局限性..我还想问一下…我为目标mips构建了交叉编译器..我需要使用此交叉编译器创建mips可执行文件…但是我无法找到可执行文件的位置…我找到了mip…

linux dns中文域名,Linux 搭建中文域名的DNS服务器

配置之前先来解释一下中文域名是如何工作的&#xff1a;当我们在浏览器上输入 朝阳.北京.中国 这个域名的时候 浏览器会把中文域名翻译成Punycode编码然后再传送给DNS服务器解析&#xff0c;例如 朝阳.北京.中国 翻译成Punycode编码以后就是xn--tpv116h.xn--1lq90i.xn--fiqs8s朝…

linux 脚本自动编制工具,全自动工具链编译脚本

GCC 工具链自动编译脚本本工具用于自动编译指定的工具链&#xff0c;可以同时生成运行于本机系统 (Build system) 和 Windows 系统(可以修改)的两套工具链具体编译规则指定于 .config 中defconfig 目录包含一些预定义的规则&#xff0c;将其复制到脚本根目录并改名为 .config 后…

linux内核全局变量同名,Linux系统下DSO同名全局变量浅析

最近重温了一下《程序员修养》&#xff0c;又搞懂了一些叽里旮旯的问题&#xff0c;现将DSO同名全局变量问题进行简单小结&#xff0c;具体的讲解请看《程序员修养》一书。程序员的自我修养—链接、装载与库.pdf版下载在Linux公社的1号FTP服务器里&#xff0c;下载地址&#xf…

node的ws的api详细讲解

WebSocket是一种在单个TCP连接上进行全双工通信的协议。Node.js中的ws模块提供了WebSocket的实现&#xff0c;使得Node.js可以轻松地创建WebSocket服务器和客户端。 在ws模块中&#xff0c;WebSocket客户端由WebSocket类实现。WebSocket提供了一系列的API&#xff0c;用于管理…

linux切换到字符界面stemctl,CentOS7两种模式

1.13 救援模式忘记root用户密码修改密码&#xff1a; 单用户模式(但只能物理机操作不能远程操作&#xff0c;gaub没加密或者知道gaub才能修改)忘记root用户密码修改密码&#xff1a; 单用户模式(但只能物理机操作不能远程操作&#xff0c;gaub没加密或者知道gaub才能修改)关机 …

c语言编程15,c语言编程15题.doc

——————日历问题——————#includeint xing(int year);int run(int year);int main(){int year;int yue[12]{31,28,31,30,31,30,31,31,30,31,30,31};int xingqi[12];int i,j,k;printf("可以计算公元前的\n请输入年份:");scanf("%d",&year);yea…

东北大学c语言真题及答案,东北大学C语言总测试题(含答案).pdf

C语言总测试题 计算机编程引论(C语言)1.一个C程序的执行是从&#xff1a; 备注及演草&#xff1a;A)本程序的main函数开始&#xff0c;到main函数结束B)本程序文件的第一个函数开始&#xff0c;到本程序文件的最后一个函数结束C)本程序的main函数开始&#xff0c;到本程序文件的…

c语言的位操作指令,C语言位运算

1. C语言中的位操作符因为C语言的设计目的是取代汇编语言&#xff0c;所以它必须支持汇编语言所具有的运算能力&#xff0c;所以C语言支持全部的位操作符(Bitwise Operators)。位操作是对字节或字中的位(bit)进行测试、置位或移位处理&#xff0c;在对微处理器的编程中&#xf…

c语言long a什么意思啊,英文long的中文是什么意思

英文long的中文是什么意思想要掌握long这个英文单词&#xff0c;我们首先就得先清楚它的中文意思是什么。为此百分网小编为大家带来英文单词long的中文意思。英文long的中文意思形容词 长的; 长时间的; 冗长的&#xff0c;过长的.; 长音的副词 长久地; 始终; 遥远地名词 长时间…

山东科技大学c语言完全题库,“山东科技大学十大未解之谜”之完全解答

“山东科技大学十大未解之谜”之完全解答(2012-04-24 13:53:36)标签&#xff1a;娱乐当我还是一枚小正太刚刚进入山科大的时候&#xff0c;我就看到过这些未解之谜&#xff0c;现在每每看到童鞋们转发这篇经久不衰的文章并且表达自己的疑问&#xff0c;我作为一名资深理科技术宅…

c语言如何一直变换颜色,【图片】(原创)用纯C变了个变色输出字符的程序。。。【c语言吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#includemain(){char c;int i,j,k,l,m,n,o;int x,y;char c1;int a,b,d,e;x35;y8;textcolor(13);gotoxy(35,10),cprintf("photoshop2014");textcolor(11);gotoxy(20,11);cprintf(" My name is zhou …

android广播注册源码,android 广播源码简要分析-注册

android broadcast1&#xff0c;广播注册静态注册&#xff1a;在系统服务启动时会添加PackageManagerService&#xff0c;在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析详细步骤1&#xff0c;PackageManagerService初始化的时候&#xff0c;扫描系统目录下的…

android盒子改造,【当贝市场】废旧手机改造成电视盒子详细教程

3.直接即可输出视频了&#xff0c;然后在手机上安装暴风影音等视频软件的tv版&#xff0c;即可开始观看。有人会说&#xff0c;旧手机电池不行&#xff0c;看一会儿就得没电&#xff0c;怎么办&#xff1f;首先&#xff0c;在你输出到电视时&#xff0c;你就可以给手机锁屏&…

android分辨率px跟dp,Android屏幕适配 px,dp,dpi及density的关系与深入理解

PX(pixel):即传统计算机语言中描述的像素&#xff0c;在Android则代表绝对像素。之所以Android中不推荐使用这种单位&#xff0c;正是因为不同生产厂商&#xff0c;不同品牌&#xff0c;不同屏幕的设备&#xff0c;其分辨率亦不一。举例来说&#xff0c;我们现在将某个Button的…

android onclick方法吗,Android中button的onClick事件几种方法

Android中button的onClick事件几种方法发布时间&#xff1a;2020-09-03 02:36:31来源&#xff1a;脚本之家阅读&#xff1a;100作者&#xff1a;水桶前辈Android中button的onClick事件几种方法利用三种方法&#xff0c;学习button的监听事件。方法一源码如下&#xff1a;packag…

android 播放器 反交错,反交错- 视频横纹处理

以下名词解释摘自维基百科反交错”(deinterlacing)是将交错式(即隔行扫描)(interlace)影像讯号转换为渐进式(逐行扫描)(progressive)影像讯号的一种方法。因为装置处理速度以及带宽的限制下&#xff0c;广播电视系统&#xff0c;例如NTSC或是PAL&#xff0c;都是使用交错式讯号…

android room表关联,如何在首次运行时填充Android Room数据库表?

我尝试了许多方法可以做到这一点&#xff0c;每个没有提供。首先&#xff0c;我尝试使用addMigrations方法向Room中添加Migration实现&#xff0c;但发现它只在数据库升级期间运行&#xff0c;但不在创建时运行。然后&#xff0c;我尝试使用openHelperFactory方法将SQLiteOpenH…

android webview简单使用,android WebView 简单使用Demo

activity配置文件&#xff1a;activity_main.xmlandroid:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical" >android:layout_width"match_parent"android:layout_height"wrap_co…

android one x2,HTC One X 深度OS Android4.1.2 大气不失稳重 雍容华贵 流畅运行

您可能感兴趣的话题&#xff1a;rom刷机核心提示&#xff1a;注意事项&#xff1a;1. 本刷机教程需在windows操作系统下进行2. 刷机前确保手机电量不少于50%3. 为避免资料丢失&#xff0c;刷机前请先备份个人资料4. 本教程内容均来自于互联网并经N多网官方整理刷机前必看注意事…