いつもEncodeのあたりでつまずいて、文字化けして
試行錯誤のすえになんとか動かしている状態なのだけど、
なにかわかった気がするのでメモ。
まず最初になにするかというと、
「use Encode」と書く。
次に外部からテキストを持ってくるとき、
それがどのような文字コードなのかきちんと把握する。
それを把握した上でデコードする。
デコード(decode)とは符号化されているものを"ほどく"ということ。
codeをdeするということ。
ほどかれた状態とはPerl内での"内部表現"に該当する。
内部表現というのは文字コードがUTF-8になることとほぼ同義という理解で
いいと思う。
文字コードが「ShiftJIS」の場合はShiftJIS向けのお化粧がしてあって、
それをdecodeするということは、
お化粧を落としてスッピンになるということ。
それをPerlでかくと「my $str = decode('shiftjis', $original)」となる。
こうやってできた$strはutf-8になっているので、
コンソールに出力するとき設定がutf-8になっているのなら
encodeせずともそのまま「print $str」とすれば文字化けせずに出るはず。
そうやって得られた $str をテキストファイルなどに出力する際は
再び"お化粧"してやる。
符号化する。encode。(code を enする、とは言わないか)
encodeはこうかけばよろし。
「 encode('shiftjis', $str) 」
それでおしまい。
ところで、HTMLソースに書かれたエンコードと実際のエンコードが違う場合がある。
そういう時は真のエンコードを知る必要があるが、
それを推定してくれるモジュールがある。
それが「Encode::Guess」で、以下のように使う。
use Encode::Guess qw( euc-jp shiftjis 7bit-jis ); my $enc = guess_encoding($original ); print $enc->name;
このGuessモジュールは万能なわけではなくて、
一応なんでも判定するつもりはあるけれども、
あらゆる可能性をしらみつぶしにするのはちょっと・・・という代物。
だから、可能性のある文字コードの候補をあらかじめ知らせておいて
その中で判断させるほうがよい。
参考にしたサイト
404 Blog Not Found:perl - Encode 入門
Encode - search.cpan.org
Perlによる日本語コード変換のメモ(第二版)
Encode::GUess - search.cpan.org