はじめに
これは、もともと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を使うことになるだろうか。