Perlの文字コードでまた石に躓いた
週末、Webアプリ(Twien)のバグをつぶしていたら、以下のような、石に躓いた。
use strict; use warnings; use Digest::MD5 qw(md5_base64); use utf8; use Encode; my $aiai = "あいあい"; print "flagged!" if utf8::is_utf8($aiai); my $digest = md5_base64($aiai); print $digest;
md5_base64の引数はバイト文字列を要求するので このままだとうまく行かない。 Wide character in subroutine entry となる encodeしてあげるといい。
さて、でも「あいあい」を「aiai」にするとUTF8フラグはたたないので すんなりとおる。
UserAgentのdecode_contentの結果はUTF8フラグが立っているので 英文の文字列でもmd5_base64を直接呼ぶと、 Wide character in subroutine entry となって落ちていた。
そんな感じで、関数によってどっち(内部、バイナリ)を要求するのか 考えながらやらないといけないということを学んだ週末でした。
学習能力が低いけれど、これだけ躓くとなんとなくわかってきた気がする。