我使用过的Linux命令之iconv - 字符编码转换工具

用途说明
iconv命令是用来转换文件的编码方式的(Convert encoding of given files from one encoding to another),比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。

常用参数
首先,我们要知道支持的字符编码有哪些,这个可以用-l参数得到(List known coded character sets)。

格式:iconv -l

其次,是怎样转换,如下所示:

格式:iconv -f from-encoding -t to-encoding inputfile

上面的调用方式,会把输出打印在屏幕上,如果要输出到文件,可以像下面这样

格式:iconv -f from-encoding -t to-encoding inputfile -o outputfile

使用示例
示例一 列出支持的字符编码
[root@new55 ~]# iconv -l
The following list contain all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,
  8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4,
  ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110,
  ARABIC, ARABIC7, ARMSCII-8, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5,
  BIG-FIVE, BIG5-HKSCS, BIG5, BIG5HKSCS, BIGFIVE, BS_4730, CA, CN-BIG5, CN-GB,
中间省略掉输出了。
  EUCJP-OPEN, EUCJP-WIN, EUCJP, EUCKR, EUCTW, FI, FR, GB, GB2312, GB13000,
  GB18030, GBK, GB_1988-80, GB_198880, GEORGIAN-ACADEMY, GEORGIAN-PS,
  GOST_19768-74, GOST_19768, GOST_1976874, GREEK-CCITT, GREEK, GREEK7-OLD,
  GREEK7, GREEK7OLD, GREEK8, GREEKCCITT, HEBREW, HP-ROMAN8, HPROMAN8, HU,
中间省略掉输出了。
  TIS620.2529-1, TIS620.2533-0, TIS620, TS-5881, TSCII, UCS-2, UCS-2BE,
  UCS-2LE, UCS-4, UCS-4BE, UCS-4LE, UCS2, UCS4, UHC, UJIS, UK, UNICODE,
  UNICODEBIG, UNICODELITTLE, US-ASCII, US, UTF-7, UTF-8, UTF-16, UTF-16BE,
  UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, UTF7, UTF8, UTF16, UTF16BE, UTF16LE,
  UTF32, UTF32BE, UTF32LE, VISCII, WCHAR_T, WIN-SAMI-2, WINBALTRIM,
  WINDOWS-31J, WINDOWS-874, WINDOWS-936, WINDOWS-1250, WINDOWS-1251,
  WINDOWS-1252, WINDOWS-1253, WINDOWS-1254, WINDOWS-1255, WINDOWS-1256,
  WINDOWS-1257, WINDOWS-1258, WINSAMI2, WS2, YU

太多了,我只想知道支持哪些中文格式的。
[root@new55 ~]# iconv -l | grep GB
CN-GB//
CSGB2312//
CSISO58GB1988//
EBCDIC-CP-GB//
GB//
GB2312//
GB13000//
GB18030//
GBK//
GB_1988-80//
GB_198880//
ISO646-GB//

有没有发现奇怪的地方,每行显示一个,并且后面加了两个斜杠。
[root@new55 ~]#

示例二 将Google香港的Big5编码转换成GBK编码
[root@new55 ~]# curl -s http://www.google.com.hk/ | iconv -f big5 -t gbk
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=Big5"><title>Google</title><script>window.google={kEI:"tFXZTNHKDcGTkAXpvOHhCA",kEXPI:"26637,27404",kCSI:{e:"26637,27404",ei:"tFXZTNHKDcGTkAXpvOHhCA",expi:"26637,27404"},ml:function(){},kHL:"zh-TW",time:function(){return(new Date).getTime()},log:function(b,d,c){var a=new Image,e=google,g=e.lc,f=e.li;a.onerror=(a.onload=(a.onabort=function(){delete g[f]}));g[f]=a;c=c||"/gen_204?atyp=i&ct="+b+"&cad="+d+"&zx="+google.time();a.src=c;e.li=f+1},lc:[],li:0,Toolbelt:{}};
id=ghead><div id=gbar><nobr><b class=gb1>所有網頁</b> <a onclick=gbar.qs(this) href="http://www.google.com.hk/imghp?hl=zh-tw&tab=wi" class=gb1>圖片</a> <a onclick=gbar.qs(this) href="http://video.google.com.hk/?hl=zh-tw&tab=wv" class=gb1>影片</a> <a onclick=gbar.qs(this) href="http://maps.google.com.hk/maps?hl=zh-tw&tab=wl" class=gb1>地圖</a> <a onclick=gbar.qs(this) f||document.f||document.gs;google.ac.i(form,form.q,'','','',{o:1,sw:1});google.mc = [[14,{}],[64,{}],[105,{}],[22,{"m_error":"\u003Cfont color=red\u003E錯誤:\u003C/font\u003E 伺服器無法完成您的要求。  請在 30 秒後再試一次。","m_tip":"按一下以取得詳細資訊。"}],[84,{}]];google.med('init');google.History&&google.History.initialize('/')});if(google.j&&google.j.en&&google.j.xi){window.setTimeout(google.j.xi,0);google.fade=null;}</script></div><script>(function(){
中间省略掉输出了。
})();
</script>[root@new55 ~]#



示例三 将我的JavaEye博客首页从UTF8转换成GBK
[root@new55 ~]# curl -s http://codingstandards.iteye.com/ | iconv -f utf8 -t gbk    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>Bash @ Linux - JavaEye技术网站</title>
    <meta name="description" content="" />
    <meta name="keywords" content="codingstandards Bash @ Linux" />
中间省略掉输出了。
<div class="blog_main">
<div class="blog_title">
<div class="date"><span class='year'>2010</span><span class='sep_year'>-</span><span class='month'>10</span><span class='sep_month'>-</span><span class='day'>17</span></div>
<div class="show_full_flag"><a href='?show_full=true'>全文显示</a></div>
<h3><a href='/blog/786653'>[置顶] 我使用过的Linux命令系列总目录</a></h3>
<strong>文章分类:<a href="http://www.iteye.com/blogs/category/os" style="text-decoration:none;padding-right:10px;">操作系统</a></strong>
</div>
<div class="blog_content">
 
    我使用过的Linux命令系列总目录
本文链接: http://codingstandards.iteye.com/blog/786653

iconv: 未知 3345 处的非法输入序列

最后一行表明有错,改用下面的就会成功了。
[root@new55 ~]# curl -s http://codingstandards.iteye.com/ | iconv -f utf8 -t gb18030

此处省略输出。有兴趣的读者可以试一下,可以完整的显示整个页面的源代码。因为gbk是gb18030的子集,gb18030包含更多的字符。

[root@new55 ~]#



示例四 将梦之都的UTF8转换成GBK
[root@new55 ~]# curl -s http://www.dreamdu.com/ | iconv -futf8 -t gbk                 
iconv: 未知 0 处的非法输入序列

有问题,用hexdump来看一下里面的字节,发现里面有ef bb bf的BOM信息,iconv不支持。
[root@new55 ~]# curl -s http://www.dreamdu.com/ | hexdump -C | less
00000000  ef bb bf 3c 21 44 4f 43  54 59 50 45 20 68 74 6d  |...<!DOCTYPE htm|
00000010  6c 20 50 55 42 4c 49 43  20 22 2d 2f 2f 57 33 43  |l PUBLIC "-//W3C|
00000020  2f 2f 44 54 44 20 58 48  54 4d 4c 20 31 2e 30 20  |//DTD XHTML 1.0 |
00000030  53 74 72 69 63 74 2f 2f  45 4e 22 20 22 68 74 74  |Strict//EN" "htt|
00000040  70 3a 2f 2f 77 77 77 2e  77 33 2e 6f 72 67 2f 54  |p://www.w3.org/T|
00000050  52 2f 78 68 74 6d 6c 31  2f 44 54 44 2f 78 68 74  |R/xhtml1/DTD/xht|
00000060  6d 6c 31 2d 73 74 72 69  63 74 2e 64 74 64 22 3e  |ml1-strict.dtd">|
00000070  0d 0a 3c 68 74 6d 6c 20  78 6d 6c 6e 73 3d 22 68  |..<html xmlns="h|

:q

那就把前面三个字节去掉试试,果然可以了。

[root@new55 ~]# curl -s http://www.dreamdu.com/ | cut -b 4- | iconv -futf8 -t gbk
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
ml xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" dir="ltr">
ead>
meta http-equiv="content-type" content="text/html; charset=utf-8" />
meta http-equiv="content-language" content="zh-CN" />
link rel="stylesheet" type="text/css" href="/style.css?v=1" media="screen" />
script type="text/javascript" src="/js.js"></script>
title>梦之都 - 网站设计与开发教程</title>
head>
ody>

中间省略掉输出。
body>
tml>

发现问题没有,每行的前面几个字符都消失了!!!
[root@new55 ~]#


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

iconv [OPTION...] [FILE...]
Convert encoding of given files from one encoding to another.

Input/Output format specification:
  -f, --from-code=NAME       encoding of original text
  -t, --to-code=NAME         encoding for output

Information:
  -l, --list                 list all known coded character sets

Output control:
  -c                         omit invalid characters from output
  -o, --output=FILE          output file
  -s, --silent               suppress warnings
      --verbose              print progress information

  -?, --help                 Give this help list
      --usage                Give a short usage message
  -V, --version              Print program version


用法: 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 365.txt >366.txt

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

注:iconv: illegal input sequence at position xxx

在使用iconv转换文件的字符编码时,如果遇到类似“iconv: illegal input sequence at position”的错误,原因是需要转换的字符编码没有涵盖文件中的字符,比如,将一个简体中文的GB2312的文件转换为BIG5的编码,而在繁体编码的BIG5里面,不包含很多的简体中文字符,所以在转换的时候就会遇到如上的错误。


另外可以使用file命令查看当前文件的编码:
file [OPTION]... [FILE]...
Determine file type of FILEs.

  -m, --magic-file LIST      use LIST as a colon-separated list of magic
                               number files
  -z, --uncompress           try to look inside compressed files
  -b, --brief                do not prepend filenames to output lines
  -c, --checking-printout    print the parsed form of the magic file, use in
                               conjunction with -m to debug a new magic file
                               before installing it
  -f, --files-from FILE      read the filenames to be examined from FILE
  -F, --separator string     use string as separator instead of `:'
  -i, --mime                 output mime type strings
  -k, --keep-going           don't stop at the first match
  -L, --dereference          causes symlinks to be followed
  -n, --no-buffer            do not buffer output
  -N, --no-pad               do not pad output
  -p, --preserve-date        preserve access times on files
  -r, --raw                  don't translate unprintable chars to \ooo
  -s, --special-files        treat special (block/char devices) files as
                             ordinary ones
      --help                 display this help and exit
      --version              output version information and exit

功能说明:辨识文件类型。

语  法:file [-beLvz][-f <名称文件>][-m <魔法数字文件>...][文件或目录...]

补充说明:通过file指令,我们得以辨识该文件的类型。

参  数:
 -b  列出辨识结果时,不显示文件名称。
 -c  详细显示指令执行过程,便于排错或分析程序执行的情形。
 -f<名称文件>  指定名称文件,其内容有一个或多个文件名称呢感,让file依序辨识这些文件,格式为每列一个文件名称。
 -L  直接显示符号连接所指向的文件的类别。
 -m<魔法数字文件>  指定魔法数字文件。
 -v  显示版本信息。
 -z  尝试去解读压缩文件的内容。

猜你喜欢

转载自wangqiaowqo.iteye.com/blog/1224141
今日推荐