|
Perl の Encode モジュールには、FB_XMLCREF というオプションがあり、 変換できない文字を HHHH; 形式で出力してくれて便利です。 (詳しくは Handling Malformed Data を参照) この FB_XMLCREF 出力が好きなので、いつも付けているのですが、 Windows でテストスクリプトが動かないことがあり、よく見ると FB_XMLCREF の有無がエラーになる原因でした。 FB_XMLCREF を外せば済むのですが、やはり必要なこともあります。 以下のサンプルスクリプトで検証してみました。 #!/usr/bin/perl 『漢字』という文字を Shift_JIS〜UTF-8 で相互変換します。 Encode::FB_XMLCREF の有無で計4種類の変換を行います。 手元の環境で実行してみた結果が↓です。 ●Fedora Core 4 OS:linux Perl:5.008006 Encode:2.08 FB_XMLCREF:0400●Fedora Core 5 OS:linux Perl:5.008008 Encode:2.16 FB_XMLCREF:0408●Mac OS X(OSデフォルト版) OS:darwin Perl:5.008006 Encode:2.08 FB_XMLCREF:0400★Mac OS X(ソースからインストール版) OS:darwin Perl:5.008008 Encode:2.12 FB_XMLCREF:0408★Windows XP(ActivePerl) OS:MSWin32 Perl:5.008008 Encode:2.12 FB_XMLCREF:0408 前者3件(●印)は4種類とも正しい変換結果ですが、 後者2件(★印)は FB_XMLCREF が付くと正しく変換できていません。 環境によって、FB_XMLCREF の値が違います。 0408 の場合は、encode.h を見ると ENCODE_LEAVE_SRC が入っています。 しかし FC4/FC5 を見ると、ENCODE_LEAVE_SRC が原因ではなさそうです。 あるいは、Encode.pm バージョン 2.12 特有の問題なのか? Perl 5.8.8 標準添付のバージョンと思うので、とすると影響が大きい…。 http://search.cpan.org/src/DANKOGAI/Encode-2.17/Changes (追記:2006/05/21) FB_XMLCREF が利用できないバージョンが確認できました。 Encode-2.10 で FB_XMLCREF の値が変更(LEAVE_SRC有効)になってから、 Encode-2.13 で解決されるまでが対象でした。2.09 以前も問題なし。 2.10〜2.12 の間も、FB_XMLCREF を使わずに 0x0400 と直打ちすれば 正常に変換されるので、FB_XMLCREF をどのバージョンでも利用したい場合は、 my $check = ( $Encode::VERSION < 2.13 ) ? 0x400 : Encode::FB_XMLCREF();のようにすれば今後の値変更にも対応できて、良さそうですね。 もちろん、Encode 本体をバージョンアップしてもらうのが最善ですが、 環境によってはなかなかバージョンアップできない場合も多いでしょうから。 CPAN にはない旧バージョンのアーカイブは、弾さんのサイト↓にありました。 http://www.dan.co.jp/~dankogai/cpan/ (ありがとうございます〜!!) (追記:2006/05/21その2) 0x0400 直打ちじゃなくて、Encode::XMLCREF() が使えるとのこと。 この FB_ の付かない XMLCREF は、POD に詳しい効能などは載っていないなので、 旧バージョンでも使えるのか不安でしたが、確認してみたら Perl 5.8.1 に付属していた Encode 1.9801 の時代から対応している模様。 0x400 と直打ちするよりも XMLCREF を使ったほうが確かに良いですね。 結論としては、古い環境(OS添付のPerlをそのまま使っていて、Encodeを 最新バージョンに上げられない環境)でも動かしたいプログラム・モジュールで XMLCREF したい場合は、 my $check = ( $Encode::VERSION < 2.13 ) ? Encode::XMLCREF() : Encode::FB_XMLCREF();とするか、ベストかな。 あるいは、from_to() を使わずに自前で decode()/encode() するか。(避けたい) 参考に、Perl 各バージョン添付の Encode のバージョンをまとめました。↓ perl-5.8.1 Encode-1.9801 XMLCREF=0x0400 FB_XMLCREF=0x0400また、Encode.pm の過去バージョンの参照には↓がオススメとのこと。 http://backpan.cpan.org/modules/by-authors/id/D/DA/DANKOGAI/ |
| << 前記事(2006/05/16) | ブログのトップへ | 後記事(2006/05/19) >> |
| タイトル (本文) | ブログ名/日時 |
|---|---|
perl - Encode::from_to() and fallback options
ゆうすけさん、いつも詳細なレビューありがとうございます。 [Perl] Encode::FB_XMLCREFでコード変換に失敗&対策 ゆうすけブログ /ウェブリブログFB_XMLCREF が利用できないバージョンが確認できました。 が、ちょっと事実誤認があるので ...続きを見る |
404 Blog Not Found 2006/05/21 12:09 |
「~」が文字化けする件について苦戦中
エントリーを普通に書くと、おそらくEncodeで変換するときに、「~... ...続きを見る |
のぶろぐ 2006/11/11 23:37 |
| 内 容 | ニックネーム/日時 |
|---|
| << 前記事(2006/05/16) | ブログのトップへ | 後記事(2006/05/19) >> |