我使用过的Linux命令之iconv - 字符编码转换工具
用途说明
iconv命令是用来转换文件的编码方式的(Convertencodingofgivenfilesfromoneencodingtoanother),比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。
常用参数
首先,我们要知道支持的字符编码有哪些,这个可以用-l参数得到(Listknowncodedcharactersets)。
格式:iconv-l
其次,是怎样转换,如下所示:
格式:iconv-ffrom-encoding-tto-encodinginputfile
上面的调用方式,会把输出打印在屏幕上,如果要输出到文件,可以像下面这样
格式:iconv-ffrom-encoding-tto-encodinginputfile-ooutputfile
使用示例
示例一列出支持的字符编码
[root@new55~]#iconv-l
Thefollowinglistcontainallthecodedcharactersetsknown.Thisdoes
notnecessarilymeanthatallcombinationsofthesenamescanbeusedfor
theFROMandTOcommandlineparameters.Onecodedcharactersetcanbe
listedwithseveraldifferentnames(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|grepGB
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-shttp://www.google.com.hk/|iconv-fbig5-tgbk
<!doctypehtml><html><head><metahttp-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(newDate).getTime()},log:function(b,d,c){vara=newImage,e=google,g=e.lc,f=e.li;a.onerror=(a.onload=(a.onabort=function(){deleteg[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><divid=gbar><nobr><bclass=gb1>所有網頁</b><aonclick=gbar.qs(this)href="http://www.google.com.hk/imghp?hl=zh-tw&tab=wi"class=gb1>圖片</a><aonclick=gbar.qs(this)href="http://video.google.com.hk/?hl=zh-tw&tab=wv"class=gb1>影片</a><aonclick=gbar.qs(this)href="http://maps.google.com.hk/maps?hl=zh-tw&tab=wl"class=gb1>地圖</a><aonclick=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":"\u003Cfontcolor=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
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="zh-CN"dir="ltr">
<head>
<metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/>
<title>Bash@Linux-JavaEye技术网站</title>
<metaname="description"content=""/>
<metaname="keywords"content="codingstandardsBash@Linux"/>
中间省略掉输出了。
<divclass="blog_main">
<divclass="blog_title">
<divclass="date"><spanclass='year'>2010</span><spanclass='sep_year'>-</span><spanclass='month'>10</span><spanclass='sep_month'>-</span><spanclass='day'>17</span></div>
<divclass="show_full_flag"><ahref='?show_full=true'>全文显示</a></div>
<h3><ahref='/blog/786653'>[置顶]我使用过的Linux命令系列总目录</a></h3>
</div>
<divclass="blog_content">
我使用过的Linux命令系列总目录
iconv:未知3345处的非法输入序列
最后一行表明有错,改用下面的就会成功了。
此处省略输出。有兴趣的读者可以试一下,可以完整的显示整个页面的源代码。因为gbk是gb18030的子集,gb18030包含更多的字符。
[root@new55~]#
示例四将梦之都的UTF8转换成GBK
[root@new55~]#curl-shttp://www.dreamdu.com/|iconv-futf8-tgbk
iconv:未知0处的非法输入序列
有问题,用hexdump来看一下里面的字节,发现里面有efbbbf的BOM信息,iconv不支持。
[root@new55~]#curl-shttp://www.dreamdu.com/|hexdump-C|less
00000000efbbbf3c21444f43545950452068746d|...<!DOCTYPEhtm|
000000106c205055424c494320222d2f2f573343|lPUBLIC"-//W3C|
000000202f2f445444205848544d4c20312e3020|//DTDXHTML1.0|
000000305374726963742f2f454e222022687474|Strict//EN""htt|
00000040703a2f2f7777772e77332e6f72672f54|p://www.w3.org/T|
00000050522f7868746d6c312f4454442f786874|R/xhtml1/DTD/xht|
000000606d6c312d7374726963742e647464223e|ml1-strict.dtd">|
000000700d0a3c68746d6c20786d6c6e733d2268|..<htmlxmlns="h|
:q
那就把前面三个字节去掉试试,果然可以了。
[root@new55~]#curl-shttp://www.dreamdu.com/|cut-b4-|iconv-futf8-tgbk
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
mlxmlns="http://www.w3.org/1999/xhtml"xml:lang="zh-CN"dir="ltr">
ead>
metahttp-equiv="content-type"content="text/html;charset=utf-8"/>
metahttp-equiv="content-language"content="zh-CN"/>
linkrel="stylesheet"type="text/css"href="/style.css?v=1"media="screen"/>
scripttype="text/javascript"src="/js.js"></script>
title>梦之都-网站设计与开发教程</title>
head>
ody>
中间省略掉输出。
body>
tml>
发现问题没有,每行的前面几个字符都消失了!!!
[root@new55~]#
iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。
iconv[OPTION...][FILE...]
Convertencodingofgivenfilesfromoneencodingtoanother.
Input/Outputformatspecification:
-f,--from-code=NAMEencodingoforiginaltext
-t,--to-code=NAMEencodingforoutput
Information:
-l,--listlistallknowncodedcharactersets
Outputcontrol:
-comitinvalidcharactersfromoutput
-o,--output=FILEoutputfile
-s,--silentsuppresswarnings
--verboseprintprogressinformation
-?,--helpGivethishelplist
--usageGiveashortusagemessage
-V,--versionPrintprogramversion
用法:iconv[选项...][文件...]
有如下选项可用:
输入/输出格式规范:
-f,--from-code=名称原始文本编码
-t,--to-code=名称输出编码
信息:
-l,--list列举所有已知的字符集
输出控制:
-c从输出中忽略无效的字符
-o,--output=FILE输出文件
-s,--silent关闭警告
--verbose打印进度信息
-?,--help给出该系统求助列表
--usage给出简要的用法信息
-V,--version打印程序版本号
例子:
iconv-futf-8-tgb2312365.txt>366.txt
这个命令读取365.txt文件,从utf-8编码转换为gb2312编码,其输出定向到366.txt文件。
注:iconv:illegalinputsequenceatpositionxxx
在使用iconv转换文件的字符编码时,如果遇到类似“iconv:illegalinputsequenceatposition”的错误,原因是需要转换的字符编码没有涵盖文件中的字符,比如,将一个简体中文的GB2312的文件转换为BIG5的编码,而在繁体编码的BIG5里面,不包含很多的简体中文字符,所以在转换的时候就会遇到如上的错误。
另外可以使用file命令查看当前文件的编码:
file[OPTION]...[FILE]...
DeterminefiletypeofFILEs.
-m,--magic-fileLISTuseLISTasacolon-separatedlistofmagic
numberfiles
-z,--uncompresstrytolookinsidecompressedfiles
-b,--briefdonotprependfilenamestooutputlines
-c,--checking-printoutprinttheparsedformofthemagicfile,usein
conjunctionwith-mtodebuganewmagicfile
beforeinstallingit
-f,--files-fromFILEreadthefilenamestobeexaminedfromFILE
-F,--separatorstringusestringasseparatorinsteadof`:'
-i,--mimeoutputmimetypestrings
-k,--keep-goingdon'tstopatthefirstmatch
-L,--dereferencecausessymlinkstobefollowed
-n,--no-bufferdonotbufferoutput
-N,--no-paddonotpadoutput
-p,--preserve-datepreserveaccesstimesonfiles
-r,--rawdon'ttranslateunprintablecharsto\ooo
-s,--special-filestreatspecial(block/chardevices)filesas
ordinaryones
--helpdisplaythishelpandexit
--versionoutputversioninformationandexit
功能说明:辨识文件类型。
语 法:file[-beLvz][-f<名称文件>][-m<魔法数字文件>...][文件或目录...]
补充说明:通过file指令,我们得以辨识该文件的类型。
参 数:
-b 列出辨识结果时,不显示文件名称。
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-f<名称文件> 指定名称文件,其内容有一个或多个文件名称呢感,让file依序辨识这些文件,格式为每列一个文件名称。
-L 直接显示符号连接所指向的文件的类别。
-m<魔法数字文件> 指定魔法数字文件。
-v 显示版本信息。
-z 尝试去解读压缩文件的内容。