Scrapdiary

DesigningとEngineeringの架け橋

未だに'require jcode.pl;'してるのはさすがにどうかと思った件

4. require jcode.pl;

日本語環境限定ではありますが。さすがに旧すぎる上、Unicode未対応という21世紀的に致命的な機能不足が。use Encode;してくだちいm(_._)m


404 Blog Not Found: perl - もうやらなくてもいい昔のコーディングテクニック

そういえば会社管理のソースで書き換える必要がないとかそんな理由からjcode.plを未だに使い続けているものあるよ。そんな現実から脱却した方がいいんじゃないかと思ったので、まずはJcodeから触れてみよう。

基本の使い方を学ぶ

use Jcode; # これがないともちろんNG

$j = Jcode->new($str, 'utf8'); # $strをutf8の文字コードで渡します、ということ
$j = Jcode->new($str); # 第二引数は省略可能
$j = Jcode->new(\$str); # リファレンス渡しもできる

これで$jというJcodeオブジェクトが生成される、と。マニュアルにはJcode->new($str [,$icode])とあるので、オプションで文字コードを指定できる。指定しない場合は$strの文字コードを自動判別するらしい。

$euc = $j->euc; # EUC-JPへ
$sjis = $j->sjis; #Shift_JISへ

オブジェクトをメソッド呼びして実行することで変更したい文字コードにすることができる、と。
なんと、少しは理解できるようになってきたのかな?>俺

先日作った簡易twitterクライアントを修正

SO901iS(古い)からPOSTすると文字化けしてしまうので、出力をUTF8からShift_JISへ変更することにした。TLを出力しているところの文字コードをJcodeで変更。一応備忘のために以前の記述も書いておく。

# 以前
foreach my $hash_ref (@$tl_ref) {
        print   $cgi->hr,
                $cgi->p($hash_ref->{'user'}{'screen_name'},":<br />", $hash_ref->{'text'}),
}

# 修正
foreach my $hash_ref (@$tl_ref) {
        my $text = Jcode->new($hash_ref->{'text'})->sjis;
        print   $cgi->hr,
                $cgi->p($hash_ref->{'user'}{'screen_name'},":<br />", $text),
}

あとはCGIオブジェクトにheader()で渡す-charsetをShift_JISに修正して終了。これで無事文字化け解消。PCブラウザやimodeチェッカーだと文字化けしなかったんだけどなぁ・・・不思議。