Encode::FB_HTMLCREFの変

PerlのEncodeモジュールとJcodeモジュールがバージョンアップしたそうなので、自宅PCのCygwin環境にインストールしてみたのです。するとその環境にある動作確認用blosxomが文字化けを起こしていまして。

動作確認用blosxomでもここと同じく、Encodeを利用したanyencodingプラグインを使っているのですが、どうもEncode::FB_HTMLCREFという定数の値が、バージョンアップ前と後で変わっているのが原因らしく。

試しに自宅PC (perl v5.8.5, Encode.pm v2.10) とLinux機 (perl v5.8.1, Encode.pm v1.98) とでEncode::FB_HTMLCREFの値を出力したところ、以下の通りとなりました。

自宅PC
$ perl -MEncode -e 'print Encode::FB_HTMLCREF,$/;'
520
Linux機
$ perl -MEncode -e 'print Encode::FB_HTMLCREF,$/;'
512

取り敢えず、anyencodingのソースEncode::FB_HTMLCREF() と書いているところを、512の数値にしてしまえば文字化けを回避できるのですが、果たしてそういう対処でよいのかどうか……。

追記

Encode 2.10のドキュメントをよく読むと、"In Encode 2.10 or later, LEAVE_SRC is also implied." (註: LEAVE_SRC = 8)とちゃんと書いてありました。なのでFB_HTMLCREFが520になるのは仕様ということでよさそうです。

また、色々試したところ、UTF-8からShift_JISへの変換で、

Encode::from_to($str, 'utf8', 'shiftjis', Encode::FB_HTMLCREF);

では変換に失敗するけれど、

$str = encode('shiftjis', decode('utf8', $str), Encode::FB_HTMLCREF);

であれば、正しく変換(かつ、Shift_JISに無い文字はHTMLの数値文字参照に変換)されるようでした。なのでfrom_toの代わりにdecodeencodeを使ったほうがよいのかも。