最近5年ぶりに本格的にperlを書いてるんだけど、ほんと楽しい。
webアプリ作るのはPHPが一番簡単&早いと思うけど、perlは、”There’s more than one way to do it”と言われる通り色んなやり方があって完成するまでのプロセスが楽しめる言語だと思う。
ただ、他の言語でもよくある問題だけど、perlのUTF8は扱いにくい。
よくわからず書いていると必ず出くわす以下のエラー。
Wide character in print at scraper.pl line 12.
久々にperlを書いてるとUTF8フラグとるのは、Encode::encode? Encode::decode?って時があるのでまとめとく。
他にも色々やり方はあるけど、一つだけです。
perlのデフォルトでは以下は6となります。
print length("モダン");
lengthはバイト数を返すのであながち間違いではないけど、見た目も気持ち悪いし内部的にUTF8で動いてないみたいです。
3を返す為には、下記の通りにします。
use utf8;
print length("モダン");
このuse utf8で内部もutf8で動きます。
use utf8を使うとperlの内部で動いてるutf8にutf8フラグというものがつきます。
ただ残念なのがuse utf8を使うと以下のコードでエラーがでます。
use utf8;
print "モダン";
→Wide character in print at scraper.pl line 12.
これはソース直書きのprint対象の文字列(モダン)にutf8フラグがついているのが原因です。
私の場合はスクリプトにはすべてuse utf8をつけて、出力の際にEncodeモジュールを使ってutf8フラグを除去して出力させています。
encodeという言い方がややこしいけど、utf8除去することがencode、逆にutf8フラグを付与する場合はdecodeとなります。
use utf8;
print Encode::encode("utf8", "モダン");
DBに保存させる時は、utf8フラグを除去して保存してくれます。
DBから値を取得した時もutf8フラグは除去されたままなので、encodeモジュールなしで出力します。