我的GB2312转化为UTF-8的代码linux iconv gbk转utf8函数为什么一直返回

linux下编码转换问题,C语言实现,使用iconv函数族_百度知道
linux下编码转换问题,C语言实现,使用iconv函数族
1、iconv的含义是将一个抽象的符号的编码进行转换。但是如果一个符号比如“个”,可能在BIG5的编码中不存在(繁体字中不同)GBK包含的是简体字,BIG5包含的是繁体字,Unicode包含全部,所以GBK-&Unicode,Big5-Unicode (总是OK)Unicode-&GBK (当里面仅包含英文及简体时OK)Unicode-&BIG5 (当里面仅包含英文及繁体时OK)GBK-&Big5 (基本上不行,除非某些字没有特别的简体字)GBK-&Big5是汉字的简繁转换,不是编码转换,简体字转繁体字还有一个问题,一个简体字可能是对应多个繁体字,这种很难转换正确。繁体字转换成简体字相对难度低。 2、#include &iconv.h&size_t iconv(iconv_t cd,char **inbuf, size_t *inbytesleft,char **outbuf, size_t *outbytesleft);函数原型, outbuf是一个 char **类型在函数手册中:The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements*inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of convertedoutput bytes
其他类似问题
为您推荐:
提问者采纳
这种很难转换正确,简体和繁体也是两个字。iconv的含义是将一个抽象的符号的编码进行转换,可能在BIG5的编码中不存在(繁体字中不同)GBK包含的是简体字;Big5 (基本上不行,除非某些字没有特别的简体字)GBK-&gt,简体字转繁体字还有一个问题;Unicode,不是编码转换。应当使用简繁通,一个简体字可能是对应多个繁体字。 说白了,Big5-Unicode (总是OK)Unicode-&gt。但是如果一个符号比如“个”,不能划等号,Unicode包含全部,BIG5包含的是繁体字;GBK (当里面仅包含英文及简体时OK)Unicode-&gt,即使意思一样。繁体字转换成简体字相对难度低,所以GBK-&Big5是汉字的简繁转换;BIG5 (当里面仅包含英文及繁体时OK)GBK-&gt显然GBK无法转换成BIG5
iconv的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁我的GB2312转化为UTF-8的代码linux iconv函数为什么一直返回_百度知道
我的GB2312转化为UTF-8的代码linux iconv函数为什么一直返回
返回 -1 就是失败了,失败了就要找为什么失败。 一般来说你这里失败可能有下面的原因: 你的 gb2312 字符串含有非法的序列。无法成功缉龚光夹叱蝗癸伟含连转换,请检查来源字符串是否合法。 你的源编码是 gbk ,应该修改为 gbk 你的源编码是 gb18030 ,应该修改为 gb...
其他类似问题
为您推荐:
iconv的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&35655人阅读
linux/mac技巧(8)
linux shell 配置文件中默认的字符集编码为UTF-8 。UTF-8是unicode的一种表达方式,gb2312是和unicode都是字符的编码方式,所以说gb2312跟utf-8的概念应该不是一个层次上的。在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。
&&& && 查了下iconv命令用法如下:
iconv [选项...] [文件...]
有如下选项可用:
输入/输出&#26684;式规范:
-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码
-l, --list 列举所有已知的字符集
输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息
所以,我在程序的末尾直接加了一句
iconv -f utf-8 -t gb2312 /server_test/reports/software_.txt & /server_test/reports/software_asserts.txt
解决了问题。
在网上查了些资料还知道在LINUX上进行编码转换时,还可以利用iconv函数族编程实现。
iconv函数族的头文件是iconv.h,使用前需包含之。
#include &iconv.h&
iconv函数族有三个函数,原型如下:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。 (3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。
例子1: 用C语言实现的转换示例程序
/* f.c : 代码转换示例C程序 */
#include &iconv.h&
#define OUTLEN 255
char *in_utf8 = &姝e?ㄥ??瑁?&;
char *in_gb2312 = &正在安装&;
char out[OUTLEN];
//unicode码转为gb2312码
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf(&unicode--&gb2312 out=%sn&,out);
//gb2312码转为unicode码
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf(&gb2312--&unicode out=%sn&,out);
//代码转换:从一种编码转为另一种编码
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
char **pin = &
char **pout = &
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
return code_convert(&utf-8&,&gb2312&,inbuf,inlen,outbuf,outlen);
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
return code_convert(&gb2312&,&utf-8&,inbuf,inlen,outbuf,outlen);
例子2: 用C&#43;&#43;语言实现的转换示例程序
/* f.cpp : 代码转换示例C&#43;&#43;程序 */
#include &iconv.h&
#include &iostream&
#define OUTLEN 255
// 代码转换操作类
class CodeConverter {
CodeConverter(const char *from_charset,const char *to_charset) {
cd = iconv_open(to_charset,from_charset);
~CodeConverter() {
iconv_close(cd);
// 转换输出
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char **pin = &
char **pout = &
memset(outbuf,0,outlen);
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
int main(int argc, char **argv)
char *in_utf8 = &姝e?ㄥ??瑁?&;
char *in_gb2312 = &正在安装&;
char out[OUTLEN];
// utf-8--&gb2312
CodeConverter cc = CodeConverter(&utf-8&,&gb2312&);
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
cout && &utf-8--&gb2312 in=& && in_utf8 && &,out=& && out &&
// gb2312--&utf-8
CodeConverter cc2 = CodeConverter(&gb2312&,&utf-8&);
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
cout && &gb2312--&utf-8 in=& && in_gb2312 && &,out=& && out &&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:201869次
排名:千里之外
原创:24篇
转载:21篇
评论:10条
(7)(2)(1)(1)(3)(9)(13)(3)(1)(1)(2)(3)我的GB2312转化为UTF-8的代码linux iconv函数为什么一直返回_百度知道
我的GB2312转化为UTF-8的代码linux iconv函数为什么一直返回
我有更好的答案
it sets errno and returns (size_t) -1.
I reversible conversions are not countedThe iconv() function returns the number of characters converted
non-reversible
call.返回不可逆转换的字符个数
返回 -1 就是失败了,失败了就要找为什么失败。 一般来说你这里失败可能有下面的原因: 你的 gb2312 字符串含有非法的序列。无法成功转换,请检查来源字符串是否合法。 你的源编码是 gbk ,应该修改为 gbk 你的源编码是 gb18030 ,应该修改为 gb...
其他类似问题
为您推荐:
iconv的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 php iconv utf8 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信