先週リリースされた 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";' のどちらも通ります(副作用なし)が、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)でも改めてチェックする必要ないかもしれませんが。 |
| << 前記事(2009/11/23) | ブログのトップへ | 後記事(2009/12/06) >> |
| タイトル (本文) | ブログ名/日時 |
|---|---|
#perl - Encode 2.39 Released!
Encode 2.39 を Release したのでお知らせします。 ...続きを見る |
404 Blog Not Found 2009/11/26 18:57 |
| 内 容 | ニックネーム/日時 |
|---|---|
元ネタはこちら:(英語) |
kawanet 2009/11/24 08:22 |
| << 前記事(2009/11/23) | ブログのトップへ | 後記事(2009/12/06) >> |