fileとiconvコマンドを結合してファイルを変換する文字コードの種類

6146 ワード

http://hi.baidu.com/netwrom/blog/item/8885f31ef0d09ae7e1fe0b1c.html
多くの種類のunixプラットフォームにはiconvツールがあります.文字コードを変換するために使えます.通常のテキストファイルに対しては、fileコマンドは、あるファイルの文字コードタイプを検出するために使用されてもよく、両者を組み合わせると、未知の符号化タイプのテキストファイルを特定の符号化タイプでエンコードすることができます.
    例えば、linuxカーネルソースコードのいくつかのファイルコードはASCIIでエンコードされていません.
$cd/path/to/linux-2.17
$file kersnel/sys.c 
ケネル/sys.c:ISO-859 C program text
    このファイルの文字コードの種類はISO-8589です.
    中にASCIIコードではないものがありますか?iconvでASCIIから回転してみます.
$iconv-f ASCII-t UTF 8 kennl/sys.c'/tmp/sys.c
iconv:illegal input sequence at position 29203
    変換エラーが発生しました.29203バイトの位置の文字コードはASCIIではありません.hexdumpとcatコマンドでこの位置が何なのか確認してください.
$hexdump-C-n 10-s 29203 kenel/sys.c
00007213  e 5 20 73 76 65 e 73 6 b  61 2 e                    |. svenska.|
0000721 d
$cat kennl/sys.cn grep svensky
*サマpsvenska.
    これはある作者の名前でしょう.
    以下はfile命令によって教えてくれます.コードタイプはISO-8589で変換します.まず、iconv-lで確認してください.
$iconv-l|  grep ISO-859
ISO-859-1//
ISO-859-2//
ISO-859-3//
ISO-859-4//
ISO-859-5//
ISO-859-6//
ISO-859-7/
ISO-859-8//
ISO-859-9//
ISO-859-9 E//
ISO-859-10//
ISO-859-11/
ISO-859-13/
ISO-859-14/
ISO-859-15/
ISO-859-16//
    明らかにサポートしていますが、直接ISO-859をサポートしていませんので、変換する時はどちらかを選んでみてください.
$iconv-f ISO-859-1-t UTF 8 kersnel/sys.c'/tmp/sys.c
    変換後のファイルサイズと29203バイトの近くの内容を見てください.
$ls-lケネル/sys.c/tmp/sys.c 
-rwxr-xr-x 1 falcon 50359 2006-06-18 09:49ケネル/sys.
-rw-r-r--1 falcon 50360 2008-06-29 14:06/tmp/sys.
$cat/tmp/sys.cn grep sven
*Samma p 900 svenska.
    まとめてみます.未知の文字コードタイプのテキストファイルを指定の符号化タイプで再符号化したいなら、どうすればいいですか?
    1.ファイルの文字コードをfileコマンドで確認する
    2.iconv-lを通じて、iconvがこのコードタイプをサポートしているかどうかを確認し、サポートすれば、その中から一番近いのを見つけてみます.
    3.できれば、iconvを使って変換します.でないと、エラーを提示します.
    このようにしてスクリプトを書くことができます.この変換プロセスは自動的に行われます.
コード:
ヽbin/bash
噫encode.sh--encode a file with an indicated encoding
噫make sure user give two argments
[$33751;菗]/&echo"Usage:`basename$0`[tougncoding][file]]&exit-1
ハmake sure the second argment is a reglar file
[!-f$2]&echo"the second argment shound be a reglar file"&exit 1
file=$2
ヽoo make sure the first argment 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$
[$file is not a text file]&ext-1
ヽoo.net encoding.......................................................
fromencoding=`echo$file_type cut-d"-f 2`.
fromencoding=`iconv-l grep$from_encoding`
[$?-ne 0]&echo"iconv not support the old encoding:$froom_encoding"
fromencoding=`echo$from_encoding cut-d"/"-f 1`.
ヽoo.ツ..............................................................encoding to_encoding
iconv-f$from_encoding-t$to_encoding$file
[Ctrl+A Select All]
    
    ダウンロード後はencode.shとして保存し、実行可能な権限を追加し、ファイルを変換してみます.
$chmod+x encode.sh
$/encode.sh UTF 8 kenel/sys.
charset-detector:自動偵察ファイルのコード化された小規模なプログラムの開発前に、通常は動機があります.私が作ったこのプログラムについては、[
PCManX;対岸のBBSプラットフォームに接続しています.残念ながら、私は面倒くさい問題があって、自分でコードを指定しなければなりません.あいにく先週自転車に乗る時、手を強く握ると軽い怪我をするので、ずっと誤字をしています.
PCManX】自動検出BBS符号化の機能を付加する.
ファイルコードを自動的に推測するアルゴリズムは、Mozilaにおいてはすでによく実行されていますが、Mozilla公式ページにも論文が提供されています.
A compsite aproach to langage/encoding detectionを参考にして、対岸のネットユーザーは簡体字中国語の翻訳を提供しました.
言語/符号化検査の複合方法]関連の実務はMozila cvs tree[
extens/universal chardet、前のブログです.
Mozila Re-licensing完了」もMozila Foundationが先日発表したもので、Mozila codebaseは元のMPL(Mozila Public License)からMPL/GPL/LGPLの三重認証モードに変換されると発表しました.
PCManX」のライセンス互換性があるので、どのように統合するかが急務です.
私は最初にNSPRのような風呂敷を取り除いて、G++の-fno-rtti、-fno-exceptions、および-nostdinc++comppilation flagsでコンパイルします.もし-lstdc++を-lsup+に両替すれば、さらにC-only braryを得ることができます.
PCManX]は、dleopenを介して内部実技を操作し、自動検出ファイルの符号化とテストプログラムを初歩的に完成させることができます.
charset-detector](bzip 2 tarball)
以下はテストプログラム(testディレクトリに置く)を例として、動作状況を見てください.initcal.txtはBig 5でエンコードされたファイルです.
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 connectを確立した後、拡散者をcharset-detect APIに渡して符号化する判断をして、後で適度な画面再描画動作を行う.
jservよりMay 22、2006年5:40 PMに発表されました.