1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | //iconv_linux下字符集编码转换轻松实现 (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 main() { 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) { iconv_t cd; int rc; char **pin = &inbuf; char **pout = &outbuf; 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); return 0; } /*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++语言实现的转换示例程序 /* f.cpp : 代码转换示例C++程序 */ #include <iconv.h> #include <iostream> #define OUTLEN 255 using namespace std; // 代码转换操作类 class CodeConverter { private : iconv_t cd; public : // 构造 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 = &inbuf; char **pout = &outbuf; 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 << endl; // 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 << endl; } 二、利用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文件。 小结: Linux为我们提供了强大的编码转换工具,给我们带来了方便。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了