Kodama's home / tips.

テキストファイルの文字コードを調べる

HTML 文書の文字コードが正しいかどうか確認したくなる事は無いでしょうか.

nkf コマンドを使用する

UNIX(Linux) 上なら nkf コマンドで次のように判別できます.(nkf 2.0.5 以降)
$ nkf --guess text.txt
Shift_JIS

ruby による実行例 1

この文書の後半にある ruby スクリプト nkf_guess.rb はテキストファイルの行毎に文字コードを推測します.
$ ./nkf_guess.rb public_html/tips.html
ASCII: 11
JIS: 186
public_html の文書は JIS で置く事にしていますから, これは期待したとおりの結果です.

ruby による実行例 2

$ ./nkf_guess.rb sample.html    
SJIS: 168
ASCII: 7
この例の HTML 文書は SJIS になっているようです.

Mozilla で読もうとすると文字が化けて読めませんでした. 実は, この文書のヘッダ部分に charset=ISO-2022-JP の指定(つまり JIS コードということ)がありました.

文書の先頭部分より.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">
.....
つまり, 実体は SJIS なのに "JIS コードです" と自己紹介していたわけです. Mozilla は charset の指定がある場合は, それにしたがって表示を試みますから, 文字化けするのが正しい動作なわけです. もし, charset の指定が無いなら, 文字コードを推測します.

ちなみに, Internet Explorer では charset の指定を無視して, 文字コードを推測してしまいますから, この例の文書は読めてしまいます. このページの作成者は Internet Explorer で確認していたので, 問題に気づかなかったのですね.

暗黙の変換や推測などは, 便利ではありますが, 問題の原因ともなることがあります.

実行例 3

$ ./nkf_guess.rb sample.pdf 
BINARY: 3287
SJIS: 2501
ASCII: 89
EUC: 994
PDF 文書を読み込んでみました. ASCII のコマンド行と BINARY データのかたまりなのですが, むりやり推測している事がわかります.

Ruby スクリプト

#!/usr/local/bin/ruby 

# テキストファイルの各行の文字コードを推測して統計を表示する
# JIS,SJIS,EUC に対応している. UNICODE には対応していない.
#
# Usage 1: nkf_guess.rb  text_file
# Usage 2: ruby nkf_guess.rb  text_file
#
## c.f. "Ruby レシピブック 268の技", ソフトバンク パブリッシング, p.41
require "nkf"
CODE_TO_NAME={NKF::JIS=>"JIS", NKF::EUC=>"EUC", NKF::SJIS=>"SJIS", NKF::BINARY=>"BINARY"}
def guess_encoding(str)
	CODE_TO_NAME[NKF.guess(str)] || "ASCII";
end

count=Hash::new(0)
readlines.each{|s| count[guess_encoding(s)]+=1 }
count.each_pair{|k,c| printf("%s: %d\n", k,c) }

Kodama's home / tips.