UTF-8 encoder doesn't support callback CHECK #Perl

先週リリースされた Encode 2.38 から、utf8 の encode/decode のチェックが変更になり、encode 時/decode 時ともに、フォールバックとしてコールバック関数を指定できなくなりました。
Encode::JP::Emoji モジュールのテストで FAIL レポート が届いて発見。
CodeRepos の Changeset 35927 で変更箇所を確認しました。
Encode.xs の Encode::utf8 用の encode/decode に変更があったようです。

再現方法。Encode.pm 2.23 の場合は、

perl -MEncode -e 'print encode("Shift_JIS", "a", sub{}), "\n";'
perl -MEncode -e 'print encode("utf8", "a", sub{}), "\n";'

のどちらも通ります(副作用なし)が、Encode.pm 3.38 では、後者は

UTF-8 encoder doesn't support callback CHECK at /.../Encode.pm line 158.

となってしまいます。
Shift_JIS など、utf8 以外のエンコーディングにエンコードする場合や、
utf8 でもサブルーチン以外(Encode::FB_XMLCREF 等)を渡した場合は、通ります。

utf8 への encode ではフォールバックが発生しないから不要というのは、理解できます。
でも、全ての CHECK が使用不可ではなくて、サブルーチンだけ禁止な理由は不明です。(教えて!)

ともかく、対策を考えなくては。。。



複数のエンコーディングに対応してフォールバック関数を使いたいとき、
utf8 にエンコードするときと、それ以外のエンコードするときを判別して
フォールバック関数の有無を呼び分ける手間を考えると、もしよければ、
使わないなら無視してくれるだけで良いのに・・・とか、思ってみたり。

別件ですが、普段は直接的には使わない Encode::utf8 を試していたら、
Encode::utf8::encode の src に文字列でなくて関数リファレンスを渡すと
Segmentation fault が発生するのを発見。

perl -MEncode -e 'print Encode::utf8::encode(undef,sub{}), "\n";'

もっとも、ここが文字列なのは Encode.pm 側で担保してくれるハズなので、
Encode.xs 側(Encode::utf8)でも改めてチェックする必要ないかもしれませんが。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

2009年11月24日 08:22
元ネタはこちら:(英語)
https://rt.cpan.org/Ticket/Display.html?id=51204

今まで callback を指定した場合に呼ばれていなかった(バグ?)なので、
呼ばないならバグ発見のために croak しようというパッチらしい。
でも、FB_XMLCREF とかは使われるので、callback も呼んでほしいなあ。

この記事へのトラックバック

  • #perl - Encode 2.39 Released!

    Excerpt: Encode 2.39 を Release したのでお知らせします。 /lang/perl/Encode/trunk - CodeRepos::Share - Trac dankoga.. Weblog: 404 Blog Not Found racked: 2009-11-26 18:57