在很多类unix平台上都有一个iconv工具,可以用来转换字符编码;而对于普通的文本文件,file命令可以用来检测某个文件的字符编码类型,结合两者就可以非常方便地把一个未知编码类型的文本文件用某一指定编码类型进行编码。

例如,linux内核源代码的某些文件编码就不是用ASCII编码的(貌似跟有些hacker“怪样”的姓名有关),例如:
$ cd /path/to/linux-2.6.17
$ file kernel/sys.c 
kernel/sys.c: ISO-8859 C program text

可见这个文件的字符编码类型是ISO-8859。
    看看里头有哪些不是ASCII编码的,用iconv试着从ASCII转一下:
$ iconv -f ASCII -t UTF8 kernel/sys.c > /tmp/sys.c
iconv: illegal input sequence at position 29203

发现转换出错了,在29203字节位置的字符编码并非是ASCII,用hexdump和cat命令看看该位置到底是什么:
$ hexdump -C -n 10 -s 29203 kernel/sys.c
00007213  e5 20 73 76 65 6e 73 6b  61 2e                    |. svenska.|
0000721d
$ cat kernel/sys.c | grep svenska
* Samma p? svenska..

估计这个应该是某个作者的名字吧。
    下面根据file命令告诉我们的编码类型ISO-8859进行转换,先得通过iconv -l查看iconv到底支持ISO-8859不?
$ iconv -l |  grep ISO-8859
ISO-8859-1//
ISO-8859-2//
ISO-8859-3//
ISO-8859-4//
ISO-8859-5//
ISO-8859-6//
ISO-8859-7//
ISO-8859-8//
ISO-8859-9//
ISO-8859-9E//
ISO-8859-10//
ISO-8859-11//
ISO-8859-13//
ISO-8859-14//
ISO-8859-15//
ISO-8859-16//

明显支持,但并不直接支持ISO-8859,所以在转换时得选择其中的一个试试。
$ iconv -f ISO-8859-1 -t UTF8 kernel/sys.c > /tmp/sys.c

ps:一个例子是 假设db2导出来是iso-8859格式,使用脚本处理过后,原文本可能就不再是ISO-8859格式了,目前使用

iconv -f ISO-8859-9 -t utf-8 $1.deliso > $1.delutf
iconv -f utf-8 -t ISO-8859-9 $1.delutf > $1.del
方式解决

    再看看转换以后的文件大小和29203字节附近的内容:
$ ls -l kernel/sys.c /tmp/sys.c 
-rwxr-xr-x 1 falcon falcon 50359 2006-06-18 09:49 kernel/sys.c
-rw-r--r-- 1 falcon falcon 50360 2008-06-29 14:06 /tmp/sys.c
$ cat /tmp/sys.c | grep sven
* Samma på svenska..

    总结一下:如果想把一个未知字符编码类型的文本文件用指定的编码类型重新编码,该怎么办呢?

1. 用file命令查看该文件的字符编码
    2. 通过iconv -l确认iconv是否支持该编码类型,如果支持,从中找出一个最接近的试试
    3. 如果可以,那么启用iconv进行转换,否则提示错误

这样就可以写一个脚本来自动进行这个转换过程了(不完善,可以自己添加一些内容),例如:

Code:
#!/bin/bash
#encode.sh -- encode a file with an indicated encoding

# make sure user give two arguments

[ "$#" != 2 ] && echo "Usage: `basename $0` [to_encoding] [file]" && exit -1

# make sure the second argument is a regular file

[ ! -f $2 ] && echo "the second argument should be a regular file " && exit 1
file=$2

# make sure the first argument is a encoding supported by iconv

iconv -l | grep -q $1
[ $? -ne 0 ] && echo "iconv not support such encoding: $1" && exit -1
to_encoding=$1

# is there a text file?
file_type=`file $file | grep "text$"`
[ $? -ne 0 ] && echo "$file is not a text file" && exit -1

# get the old encoding
from_encoding=`echo $file_type | cut -d" " -f 2`
from_encoding=`iconv -l | grep $from_encoding`
[ $? -ne 0 ] && echo "iconv not support the old encoding: $from_encoding"
from_encoding=`echo $from_encoding | cut -d"/" -f 1`

# convert the file from from_encoding to to_encoding
iconv -f $from_encoding -t $to_encoding $file

[Ctrl+A Select All]
    
    下载以后保存为encode.sh,添加可执行权限,并转换一个文件试试。
$ chmod +x encode.sh
$ ./encode.sh UTF8 kernel/sys.c

charset-detector:自動偵測文件編碼的小程式

發展程式前,通常會有個動機,而就我剛剛做的這個小程式來說,就是為了透過 [PCManX] 連線到對岸的 BBS 站台,可惜我遇到很麻煩的問題,就是得自己指定編碼,偏偏上週騎腳踏車時,把手握太大力造成輕微受傷,所以一直打錯字... Anyway,我決定要替 [PCManX] 加上自動偵測 BBS 編碼的功能。

自動猜測文件編碼的演算法,在 Mozilla 中已經有不錯的實做,而 Mozilla 官方網頁也提供論文 [A composite approach to language/encoding detection] 作參考,對岸的網友提供了簡體中文翻譯 [一種語言/編碼檢測的復合方法],相關的實做可參考 Mozilla cvs tree [extensions/universalchardet],而之前的 blog [Mozilla Re-licensing 完畢] 也提到 Mozilla Foundation 日前宣佈,Mozilla codebase 由原本的 MPL (Mozilla Public License) 轉換為 MPL / GPL / LGPL 三重授權模式,這與 [PCManX] 的授權相容,所以當務之急就是如何整合。

我初步將 NSPR (Mozilla Runtime) 一類的包袱去掉,並且用 G++ 的 -fno-rtti、-fno-exceptions,以及 -nostdinc++ compilation flags 來編譯 ,如果將 -lstdc++ 換成 -lsupc++,還可進一步得到 C-only library,目標是作成一個 add-on,讓 [PCManX] 可透過 dlopen 來操控內部實做,初步完成自動偵測文件編碼與測試程式,名為 [charset-detector] (bzip2 tarball)。

以下以測試程式 (放在 test 目錄下) 作範例,看看運作情況,initcall.txt 是個用 Big5 編碼的文件:

  • charset-detector/test$ file initcall.txt
    initcall.txt: ISO-8859 English text, with CRLF line terminators
    charset-detector/test$ ./test-chardetect ./initcall.txt
    File ./initcall.txt ...
    Charset = Big5
    

UNIX 的工具 file 就誤判了,還好咱們的 charset-detector 正確識別編碼,而 charset-detect library 的 API 只有六個,很容易操作。下一步就是 hack [PCManX],使其建立 BBS connection 後,將 buffer 傳遞給 charset-detect APIs 作編碼的判斷,稍後作適度的畫面重繪動作。
由 jserv 發表於 May 22, 2006 05:40 PM

iconv文件格式转换相关推荐

  1. 用iconv 文件格式转换

    原文地址:http://www.cnblogs.com/wanyao/p/3399269.html #!/bin/bash files=`file * | grep "ISO-8859&qu ...

  2. vim windows linux文件格式转换

    vim windows linux文件格式转换 set ff?     #显示当前文件格式 set ff=unix     #设置成unix格式 set ff=dos #设置成dos格式 posted ...

  3. Windows应用程序文件格式转换控件LEADTOOLS ePrint Professional

    2019独角兽企业重金招聘Python工程师标准>>> LEADTOOLS ePrint Professional控件是一个多功能一体化文件转换解决方案,它可帮助您将任何Window ...

  4. 如何在DOS/Windows和Linux/Unix之间进行文件格式转换?

    如何在DOS/Windows和Linux/Unix之间进行文件格式转换?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-c ...

  5. bmp转换tiff c++代码_Creative Convert for Mac(文件格式转换工具)

    Creative Convert for Mac是应用在Mac上的一款文件格式转换工具,可将PDF,Ai,PSD和/或EPS文件转换为独立的图形文件格式,不需要PDF阅读器或图像编辑器,将每页保存为独 ...

  6. 结合file和iconv命令转换文件的字符编码类型

    http://hi.baidu.com/netwrom/blog/item/8885f31ef0d09ae7e1fe0b1c.html 在很多类unix平台上都有一个iconv工具,可以用来转换字符编 ...

  7. python实现文件格式转换_python实现快速文件格式批量转换的方法

    用python实现文件夹下的成批文件格式转换 我们对于文件转换的需求很大,甚至于对于图片的格式,JPG和PNG格式在肉眼看来都没什么差别,但是对于计算机而言,它有时候就只接受这些肉眼看起来差不多的格式 ...

  8. 常用文件格式转换大全: PDF转Word,WORD转PDF转换器,DOCX转DOC转换

    为什么80%的码农都做不了架构师?>>>    常用文件格式转换大全: Diywz - PDF转Word,WORD转PDF转换器,DOCX转DOC转换器  常用的文件格式互转工具,实 ...

  9. PDF文件格式转换攻略:PDF格式转换图片格式

    关于PDF文件格式的转换大家有了解多少吗?就比如将PDF格式转换成图片格式,可能之前大家对于PDF件大家都有了解到,办公中我们经常遇到过.现在小编在这里教大家如何将PDF格式转换成图片格式,有兴趣的伙 ...

最新文章

  1. 爬取股票信息(股票代码+价格)
  2. WCF面向服务应用程序系列之一:Hello WCF
  3. C++反转字符串的算法(附完整源码)
  4. 《恐怖小说在中国》之四:恐怖小说的流行与陷阱?
  5. ----斐波那契数列---eval函数----类递归思想 栈 进出 思想
  6. 可以让你少奋斗十年的工作经验
  7. linux的几个文本内容查看命令小结
  8. Mipmap纹理技术简介
  9. java 代码结构_代码结构说明
  10. 30岁学python有前途吗-我30岁了,转行学编程可以吗? 排除法告诉你答案
  11. ceil函数_pyspark常用函数
  12. HTML5新增的视频元素与音频元素
  13. 适应网络伦理关系要求的新的伦理观
  14. Pycharm 搭建 Django 项目 (非常详细)
  15. Keil 5安装教程(C51与MDK共存)
  16. Java项目的一些文件及其功能、使用方式。
  17. 关于癌症的思考:癌症的本质是什么
  18. 信息内容安全-《人民的名义》人物图谱分析实验
  19. 哈尔滨理工大学21级新生程序设计竞赛(同步赛)Jay的小迷弟(快速幂)
  20. PDF有权限密码怎么办?

热门文章

  1. 注意力提高神经回路的突触功效和信噪比(Farran Briggs, George R. Mangun W. Martin Usrey)
  2. 爱聊天(LoveChat)即时通讯聊天APP系统——技术架构
  3. 图扑软件亮相 2022 福州数博会,携手共创数字新时代
  4. C++ boost库智能指针(四):intrusive_ptr
  5. 阿里云盘又搞事,最新福利码来了!限时!
  6. 我是如何从测试开发做到年薪百万的
  7. Android monkey使用简略
  8. 微信端在电脑点不能点击下拉框
  9. 如何在Simulink中添加自己的库?
  10. ubuntu下创建python文件创建python环境