Strawberry Perl 5.12.3でHTTP::Message 6.02がUTF-8を受け付けない
以下のようなコードでエラーが出る。
use HTTP::Message; my $m = HTTP::Message->new; $m->content("\x{1f603}");
HTTP::Message content must be bytes at - line 3
Unicode文字列は渡せないそうだ。
内部で呼んでいるutf8::downgradeは、perldocによるとネイティブの8-bit encodingに変換する関数らしいので、
use locale; use POSIX qw(LC_ALL setlocale); setlocale(LC_ALL, 'English_United States.65001');
してみたのだが変わらず*1。
一度はモジュールのバグかと思ったが、考えてみるとメッセージボディはtext/*とは限らない。ライブラリレベルでは現状のoctet sequence以外をはじくくらいでよい気がする。
そういうわけで呼び出し側で都度対処する場合はutf8::is_utf8()やutf8::encode()あたりを使ってUTF-8フラグを落とせばよい。
utf8::encode($content); $m->content($content);
*1:locale関係はシステム依存が大きいのでportabilityに欠けるのもマイナス。