2013年7月21日日曜日

fileコマンドがテキストファイルでエラーになる問題の回避

昨日、WindowsやLinuxで作成したテキストファイルの文字コーディングを調べようとしたら、fileコマンド( /usr/bin/file )でエラーがでました。
fileコマンドは、ファイルの音声や画像などの種類や、テキストファイルの場合文字エンコーディングなどを表示してくれるコマンドです。
やりたかったのは、UTF-8以外のファイルを探して、必要ならばUTF-8に変換しようと思ったのですが。

例えば以下の内容のファイル(UTF-8)をfileコマンドで調べると、ERRORとなります。(OS X 10.8.4)


$ cat test.txt
- 外部キー
  他のテーブルの主キーとなるキー
  外部キーは表の結合に用いる
od -c -t x1 test.txt
0000000    -      外  **  **  部  **  **  キ  **  **  ー  **  **  \n    
           2d  20  e5  a4  96  e9  83  a8  e3  82  ad  e3  83  bc  0a  20
0000020       他  **  **  の  **  **  テ  **  **  ー  **  **  ブ  **  **
           20  e4  bb  96  e3  81  ae  e3  83  86  e3  83  bc  e3  83  96
0000040   ル  **  **  の  **  **  主  **  **  キ  **  **  ー  **  **  と
           e3  83  ab  e3  81  ae  e4  b8  bb  e3  82  ad  e3  83  bc  e3
0000060   **  **  な  **  **  る  **  **  キ  **  **  ー  **  **  \n    
           81  a8  e3  81  aa  e3  82  8b  e3  82  ad  e3  83  bc  0a  20
0000100       外  **  **  部  **  **  キ  **  **  ー  **  **  は  **  **
           20  e5  a4  96  e9  83  a8  e3  82  ad  e3  83  bc  e3  81  af
0000120   表  **  **  の  **  **  結  **  **  合  **  **  に  **  **  用
           e8  a1  a8  e3  81  ae  e7  b5  90  e5  90  88  e3  81  ab  e7
0000140   **  **  い  **  **  る  **  **  \n                            
           94  a8  e3  81  84  e3  82  8b  0a                            
0000151
$ file test.txt
test.txt: ERROR: line 22: regexec error 17, (illegal byte sequence)

fileコマンドで、regexec関数を呼び出していて、その関数が不正なバイトの並びを見つけたというエラーのようです。test.txtは3行しかありませんので、行番号の22は、コマンドかライブラリのソースコードの行番号でしょう。
以前は、このようなエラーを見たことがなかったのですが、いつから出るようになったのでしょうか。

いろいろ試行錯誤したところ、localeの環境変数(LANGなど)を消すかCにすると正常に表示されるようになりました。

echo $LANG
ja_JP.UTF-8
$ LANG=C file test.txt
test.txt: UTF-8 Unicode text
$ unset LANG
$ file test.txt
test.txt: UTF-8 Unicode text

あまり、めでたしめでたしではないですが、暫定的には解決できました。

0 件のコメント:

コメントを投稿