実際的な文字コードの問題がありまして、これが結構難解なのです。文字コードを判定するというコマンド類で自分が慣れ親しんでいる言語からいくつか選んでいろいろやってみた結果が以下のようになりました。実際問題として予想される文字コードは、
改行コードは、
ここまで考えて、nkfコマンド、mb_detect_encoding(PHP)、Jcode::getcode(Perl)という関数を選んでどういう結果が得られるかを実験したのが以下の結果です。
やり方もいろいろあるんでしょうけど、返り値を整理すると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()でやるのが一番いいみたいです。かなり面倒くさい感じですが...。
- Shift JIS
- EUC JP
- UTF-8
- ISO-2022-JP(JIS)
改行コードは、
- CRLF
- CR
- LF
ここまで考えて、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 |
比較的安定して文字列を評価するのがJcode::getcodeでした。改行コードCRの場合だけどうしてだかBINARYという誤診をしますが、あらかじめ改行コードを変換してやると大丈夫なような気がします。さすがPerl。しかしPerl上でnkfを実行したら軒並みASCIIで文字コード判別やる気なし。逆にPHP上でのnkfコマンドはやる気満々でまあまあの判定。EUC-JPのLFではどうしてBINARYになるのか全くわからんのですが。。。。
結果、改行コードはあらかじめLF(\n)に統一しておいて、それからnkfでファイルの文字コードを判別してさらに一行ごとに文字列の判定をJcode:getcode()でやるのが一番いいみたいです。かなり面倒くさい感じですが...。



