Kodama's home / tips.
$ nkf --guess text.txt Shift_JIS
$ ./nkf_guess.rb public_html/tips.html ASCII: 11 JIS: 186public_html の文書は JIS で置く事にしていますから, これは期待したとおりの結果です.
$ ./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 で確認していたので, 問題に気づかなかったのですね.
暗黙の変換や推測などは, 便利ではありますが, 問題の原因ともなることがあります.
$ ./nkf_guess.rb sample.pdf BINARY: 3287 SJIS: 2501 ASCII: 89 EUC: 994PDF 文書を読み込んでみました. ASCII のコマンド行と BINARY データのかたまりなのですが, むりやり推測している事がわかります.
#!/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.