実際的なファイル文字列の文字コード問題

2011.02.10 1:16
 実際的な文字コードの問題がありまして、これが結構難解なのです。文字コードを判定するというコマンド類で自分が慣れ親しんでいる言語からいくつか選んでいろいろやってみた結果が以下のようになりました。実際問題として予想される文字コードは、
  • Shift JIS
  • EUC JP
  • UTF-8
  • ISO-2022-JP(JIS)
だと思います。画像ファイルなどはBINAYとなる筈なんですが...。
改行コードは、
  • CRLF
  • CR
  • LF
となる筈です。ここ近年、CRというのは殆ど現れてこないんじゃないかと思っているけど一応考慮しないとダメだろうなぁと。
 ここまで考えて、nkfコマンド、mb_detect_encoding(PHP)、Jcode::getcode(Perl)という関数を選んでどういう結果が得られるかを実験したのが以下の結果です。


nkf(php) nkf(perl) mb_detect_encodeing Jcode:getcode
UTF-8 (CRLF) UTF-8(CRLF) ASCII UTF-8 utf8
UTF-8 (CR) UTF-8(CR) ASCII UTF-8またはNULL utf8(改行コード認識なし
UTF-8 (LF) UTF-8(LF) ASCII UTF-8 utf8
EUC-JP (CRLF) CP51932(CRLF) ASCII UTF-8またはNULL euc
EUC-JP (CR) CP51932(CR) ASCII UTF-8またはNULL binary
EUC-JP (LF) BINARY ASCII NULL euc
SJIS (CRLF) CP932(CRLF) ASCII UTF-8またはNULL sjis
SJIS (CR) CP932(CRLF) ASCII UTF-8またはNULL sjis(改行コード認識なし)
SJIS (LF) CP932(LF) ASCII UTF-8またはNULL sjis
JIS (CRLF) ISO-2022-JP(CRLF) ASCII UTF-8 jis
JIS (CR) ISO-2022-JP(CR) ASCII UTF-8 binary
JIS (LF) ISO-2022-JP(LF) ASCII UTF-8 jis
 やり方もいろいろあるんでしょうけど、返り値を整理するとmb_detect_encodingの結果がめちゃくちゃでした。UFT-8以外の文字コードを全く判定しないという始末。このコードはUTF-8の文字コードで書かれているのでこういう結果になるんだろうと思います。SHIFT-JISで書いたコードでは軒並みSHIFT-JISになってしまうのではないかと予想されます。mb_detect_encodingは全く使えない関数であること間違いなし。PHPコードの文字コード変換などは、元の文字コードを明示しないと正しく文字コード変換できないというのがあったりして、これを含めて、全く使えない。予想しがたいファイルをどうやって判定するのかというのを考慮すると全然だめです。
 比較的安定して文字列を評価するのがJcode::getcodeでした。改行コードCRの場合だけどうしてだかBINARYという誤診をしますが、あらかじめ改行コードを変換してやると大丈夫なような気がします。さすがPerl。しかしPerl上でnkfを実行したら軒並みASCIIで文字コード判別やる気なし。逆にPHP上でのnkfコマンドはやる気満々でまあまあの判定。EUC-JPのLFではどうしてBINARYになるのか全くわからんのですが。。。。
 結果、改行コードはあらかじめLF(\n)に統一しておいて、それからnkfでファイルの文字コードを判別してさらに一行ごとに文字列の判定をJcode:getcode()でやるのが一番いいみたいです。かなり面倒くさい感じですが...。






プロフィール



  • Name :: 山上オサム ♂(39)
  • Hobby :: 武術
  • Work :: Web Designer