LoginSignup
5
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-05

はじめに

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

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1