Mail::Message::Encode クラス Mail::Message::Encode の使い方の見本 [リファレンス] fml-help ML's Count: 02012, 02013, 02016 など [使い方の例] * fml 8.0 風の使い方 use Mail::Message::Encode; my $encode = new Mail::Message::Encode; my $str_euc = $encode->convert( $s, 'euc-jp' ); my $str_euc = $encode->convert( $s, 'euc-jp', 'iso-2022-jp' ); my $encode = new Mail::Message::Encode; my $status = $encode->convert_str_ref( \$s, 'euc-jp' ); my $status = $encode->convert_str_ref( \$s, 'euc-jp', 'jis' ); my $fp = sub { ... }; $encode->run_in_chcode( $fp, $oout, $in ); * fml 4.0 互換風の使い方 ues Mail::Message::Encode qw(STR2EUC); my $euc_s = STR2EUC( $s ); Mail::Message::Encode の仕様の粗筋 本体はプライベートメソッド _convert_str_ref() にまとめてある。 sub convert # 引数が STR { my ($self, $str, $out_code, $in_code) = @_; _convert_str_ref(\$str, $out, $in); return $str; } sub convert_str_ref # 引数が STR_REF { my ($self, $str, $out, $in) = @_; _convert_str_ref($str, $out, $in); } sub _convert_str_ref # 引数が STR_REF { my ($str, $out, $in) = @_; # 1. 推測 もし $in がない → 推測 → 失敗 → 0 をかえす? # 2. 変換をトライ if ($in がわかった or $in が指定された) { $out へ変換 jcode, Jcode, Encode は perl バージョンによって よろしく変換をがんばる return 1 ; #成功 } else { # principle of least surprise ? なにもしない# str はそのまま返す } return 0 ; # 失敗 } sub base64 {} sub quoted_printable {} があるといいかな〜 $x = $encode->base64($s); また、互換性というか便宜上、STR2XXX() も準備する。 STR2EUC( $str, [$icode] ) STR2JIS( $str, [$icode] ) STR2SJIS( $str, [$icode] ) は convert_str_ref を wrap する。 ユーティリティ run_in_chcode() 言語依存処理の過程では、プログラムの扱いやすい文字コードに変換し、 処理を行なう関数が多数存在します。 そこで、そういった処理のための下請け関数を用意すると便利です。 run_in_chcode() は、 関数 $proc を実行します。 引数は、あらかじめ指定された文字コードに変換後、 関数 $proc に渡されるという仕様です。 sub run_in_code { my ($self, $proc, $s, $args, $out_code, $in_code) = @_; my $proc_status = undef; my $obj = new Mail::Message::Encode; my $conv_status = $obj->convert_str_ref(\$s, $out_code, $in_code); # XXX-TODO: validate $proc name regexp. eval q{ $proc_status = &$proc($s, $args); }; # XXX-TODO: correct ? if ($conv_status && $out_code) { $obj->convert_str_ref($s, $out_code, $in_code); } return wantarray ? ($conv_status, $proc_status): $conv_status; } これは、次のように動作します。 $s は EUC-JP へ変換。 $proc($s, $args); を実行 $proc の実行結果を返す。