Help us understand the problem. What is going on with this article?

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

h_hiro_
本業ではアルゴリズム作ったりしてます。プログラミングは業務経験はないですが趣味&本業の研究でいろいろ書いてます。
http://hhiro.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away