Kawanet Tech Blog

アクセスカウンタ

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

<<   作成日時 : 2009/11/23 21:36   >>

ブログ気持玉 0 / トラックバック 1 / コメント 1

先週リリースされた 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)でも改めてチェックする必要ないかもしれませんが。

テーマ

関連テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
#perl - Encode 2.39 Released!
Encode 2.39 を Release したのでお知らせします。 ...続きを見る
404 Blog Not Found
2009/11/26 18:57

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(1件)

内 容 ニックネーム/日時
元ネタはこちら:(英語)
https://rt.cpan.org/Ticket/Display.html?id=51204

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

コメントする help

ニックネーム
本 文
UTF-8 encoder doesn't support callback CHECK #Perl Kawanet Tech Blog/BIGLOBEウェブリブログ
[ ]