camel

ゆうすけさん、いつも詳細なレビューありがとうございます。

[Perl] Encode::FB_XMLCREFでコード変換に失敗&対策 ゆうすけブログ /ウェブリブログ
FB_XMLCREF が利用できないバージョンが確認できました。

が、ちょっと事実誤認があるので。

これ、単に、

  • 2.12までEncode::from_to($str, $from, $to, $check)は、decode()の時にもencode()$checkの値を使っていたが、
  • 2.13以降では、encode()時にのみ$checkの値を適用する

という仕様変更に伴うものです。これのきっかけは、miyagawa君からの報告でした。

ふたたび Encode の件で。
utf-8 あるいは latin-1 が含まれてい string をとってきて、すべて utf-8 にエンコードしなおす、というコードを書きたいんですが、
Encode::decode("utf-8", "bar\xe0foobar", sub { warn $_[0] })
みたいなことをすると
$Result = 'baràfoobar';
$Result = 'bar';
Modification of a read-only value attempted at
/usr/local/lib/perl5/5.8.7/i686-linux-thread-multi-64int/Encode.pm
line 167.
など、動作が不定になるようです。

これを期に、Encode 2.13以降ではfrom_toのfromの段階、すなわちdecodeの際にはcheckせずとにかくutf8化し、toの段階にあたるencodeの際にcheckを適用するという風にしたのですが、その結果、FB_(PERLQQ|HTMLCREF|XMLCREF)のFBが不要になったのです。

[Perl] Encode::FB_XMLCREFでコード変換に失敗&対策 ゆうすけブログ /ウェブリブログ
2.10〜2.12 の間も、FB_XMLCREF を使わずに 0x0400 と直打ちすれば

この0x400こそ、FB_のついていないEncode::XMLCREFの値です。ですから、決め打ちせず、

my $check = ( $Encode::VERSION < 2.13 ) ?  Encode::FB_XMLCREF() : Encode::XMLCREF();

としていただければ幸いです(向きにも注意!古い方がFB_が必要な方です)。

あと、

CPAN にはない旧バージョンのアーカイブは、弾さんのサイト↓にありました。
http://www.dan.co.jp/~dankogai/cpan/
(ありがとうございます〜!!)

ですが、こちらは有名なBACKPAN

BACKPAN
http://backpan.cpan.org/
DANKOGAI@BACKPAN
http://backpan.cpan.org/modules/by-authors/id/D/DA/DANKOGAI/

を利用した方が賢明でしょう。

以上取り急ぎ

Dan the Encode Maintainer