kubotさんより、utf-8からeuc変換前に文字数を判断してしまうと、3バイトコードがあるときに希望する文字数を得られないのではないか、というご指摘を受けました。確かにそのとおりですね。kubotさん、ありがとうございました。
というわけで、修正したコード(ほぼ、kubotさんがコメントに書いてくださったコードそのままですが・・・)を載せておきます。以前のエントリーのソースは自戒の念を込め、追記のみでそのままにしておきます。
2004/3/29追記:このスクリプトはmuraさんの記事(M’s folder: MT 長いタイトルをトリミングする)で公開されているものをEUC以外の文字コードに対応するように改変したものです。
2005/9/30追記:Encodeモジュール版はこちら。
# 指定された文字数(半角文字数)にトリミングするフィルタ package MT::Plugin::Trimj; use MT::Template::Context; use MT::ConfigMgr; MT::Template::Context->add_global_filter(trimj_to => sub { my($str, $nstr, $ctx) = @_; my $sippo = '...'; my $tmpstr = $str; my $c = MT::ConfigMgr->instance->PublishCharset; my $conv_in; if (lc $c eq lc 'Shift_JIS') { $conv_in = 'sjis'; } elsif (lc $c eq lc 'ISO-2022-JP') { $conv_in = 'jis'; } elsif (lc $c eq lc 'UTF-8') { $conv_in = 'utf8'; } elsif (lc $c eq lc 'EUC-JP') { $conv_in = 'euc'; } my $jcnv; eval 'use Jcode;'; if($@){ require 'jcode.pl'; $jcnv = 'jcode::convert'; }else{ $jcnv = 'Jcode::convert'; } if ($conv_in ne 'euc') { &$jcnv($str, 'euc', $conv_in); } # 比較をここに移動 my $lenstr = length($str); if($lenstr <= $nstr) { return $tmpstr; } my $out = substr($str,0,$nstr); if ($out =~ /x8F$/ or $out =~ tr/x8ExA1-xFE// % 2) { chop $out; if($out =~ /x8F$/){ chop $out; } } $out .= $sippo; # 尻尾を付けたくない場合は、コメントアウトのこと。 if ($conv_in ne 'euc') { &$jcnv($out, $conv_in, 'euc'); } return $out; }); 1;
89 Comments
Pingback: PukiWiki/TrackBack 0.1
Pingback: 私は快楽なんて知らない
Pingback: POWER BLOG SIDE
Pingback: SG::Acme
Pingback: re-in-car-na-tion
Pingback: COLOR NO.A
Pingback: Q&A Navi
Pingback: skyward
Pingback: |: caramel*vanilla 2 :|
Pingback: *vitalage*blog
Pingback: 機械忍者
Pingback: Blog VINAPARK
Pingback: Jolie's
Pingback: blog:N@TURE BRAIN
Pingback: ROOFTOP BLOG
Pingback: Paqn! ミカニッキ
Pingback: Twinkle*Tips
Pingback: chiricoyet :: MT
Pingback: mayu in blog
Pingback: blog @ naotaka.com
Pingback: Lithium
Pingback: yuki no hi no shimauma
Pingback: Dybbuk Debugs.
Pingback: 蒼い雫をすくって
Pingback: dimanche
Pingback: kazunoblog
Pingback: strawberry photographics
Pingback: Stupid excuse!!
Pingback: やむやむ
Pingback: 野良犬の塒
Pingback: TOY COZY MUSEUM 別館
Pingback: ユキノヒノシマウマ
Pingback: Daily note.o○
Pingback: 今日の覚え書き
Pingback: 我楽
Pingback: SnowDrop
Pingback: 特命係長・憤慨仁
Pingback: Ui-ed