鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

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 となって落ちていた。

そんな感じで、関数によってどっち(内部、バイナリ)を要求するのか 考えながらやらないといけないということを学んだ週末でした。

学習能力が低いけれど、これだけ躓くとなんとなくわかってきた気がする。

参考文献 Perl: 文字コードとutf8フラグについて - bayashi.net