日本語対応トリミングフィルタ(再度バグ修正)

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

  • コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です