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

赵丹icons逐LJ 2011-10-31

用途说明

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 尝试去解读压缩文件的内容。

相关推荐