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: Templates
Pingback: GoGoSurf
Pingback: mayu*can
Pingback: スヌーピーキャンディー
Pingback: 惜賭馬 Blog
Pingback: gr8jun - ブログのようなもの
Pingback: /nev/dull/Blog
Pingback: voda FREAKS
Pingback: ♪ごきげんBLOG♪
Pingback: スズ風呂
Pingback: Old English White.com
Pingback: MovableTypeを活用して脱初心者!
Pingback: SweetBubbles
Pingback: お気楽Blog☆
Pingback: コマわり。
Pingback: Lithium
Pingback: happyfreak_weblog
Pingback: [嘘]Liar's web
Pingback: SWEET WATER Web Server
Pingback: delgraphixx
Pingback: Flan*Flan
Pingback: 人生迷い箸
Pingback: 腐女子のMovableTypeカスタマイズ感想文
Pingback: Hesokuri-Way×へそくりライフ
Pingback: ponta web.
Pingback: MediAhead.jp
Pingback: MediAhead.jp
Pingback: MediAhead.jp
Pingback: オラオラ
Pingback: はしゅはしゅどっとねっと
Pingback: 自宅サーバー構築ブログ
Pingback: ABEKE - Design side -
Pingback: MovableTypeを活用して脱初心者!
Pingback: syukoclip
Pingback: MovableType備忘録