Edited at

UTF-8で書かれたファイルについて、EUC-JPやShift_JISで扱えない文字を検出する

More than 3 years have passed since last update.


はじめに

これは、もともと2013年3月19日に書いたコードがまた欲しくなったため、備忘的にQiitaに持ってきたものです。


方法

コマンドラインでnkfが利用可能という前提で説明します。


EUC-JPで扱えない文字を検出する場合

# bashなどの場合

nkf -e --no-best-fit-chars --fb-perl FILENAME | grep -n '\\x{[0-9]\+}'

# コマンドプロンプトの場合
nkf -e --no-best-fit-chars --fb-perl FILENAME | grep -n "\\x{[0-9]\+}"



Shift_JISで扱えない文字を検出する場合

# bashなどの場合

nkf -s --no-best-fit-chars --fb-perl FILENAME | grep -n '\\x{[0-9]\+}'

# コマンドプロンプトの場合
nkf -s --no-best-fit-chars --fb-perl FILENAME | grep -n "\\x{[0-9]\+}"


例えば、

がんばれ♥がんばれ♥

がんばれ★

というファイルにこのコマンドを使うと(♥はEUC-JPやShift_JISで扱えないが、★は扱える)、



1:がんばれ\x{2665}がんばれ\x{2665}



となり、1行目に扱えない文字があると表示してくれる(表示結果の「1:」が「1行目」を意味する)。


解説


  • 「--no-best-fit-chars」は、変換してから戻せないような文字がある場合に、それを変換しないことを意味する。

  • 「--fb-perl」は、変換できない文字をPerl形式「\x{0000}」で表示する。

これによって、EUC-JPやShift_JISで扱えない文字をPerl形式で表示している。

また、grepのオプションで「-n」を指定すると、合致した行を表示する際に行番号を付与する。


あとで調べておきたい

日本語以外の文字コードについても同様のことができないか調べる(この方法はnkfに完全に依存しているので)。例えば、Shift_JISで書かれたファイルについてUS-ASCIIで扱えない文字を検出する、とか。iconvを使うことになるだろうか。