このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

PERLで2バイト文字列をCHOPすると、どうしても豆腐になってしまう?

発言者:Du Yuan
( Date Saturday, February 14, 1998 00:07:43 )


今、MacPERL使って掲示板スクリプトを作っていまして、
記事の題名のリンクだけをツリー状表示するINDEXページで、長すぎ
る題名は短くちょんぎって「タイトル...」みたいな形にしたいのですが、
どうも上手くいきません。CHOP($subject)を使い($subject
が題名です)、length($subject)の語尾が偶数の場合は
偶数回、奇数の場合は奇数回CHOPをかければいいのかな、と単純に
思ってたんですけど、ダメみたいなのです。ちょうどちぎれる部分に2バ
イトキャラが来ると半分になるのか四角い豆腐記号になってしまいます:

 $subject_length = length ($subject);
 if ($subject_length > 26)
 {
  $cut_even = $subject_length;
  chop($cut_even);
  if ($cut_even eq "0") {$cut_num = $subject_length - 26;}
  elsif ($cut_even eq "2") {$cut_num = $subject_length - 26;}
  elsif ($cut_even eq "4") {$cut_num = $subject_length - 26;}
  elsif ($cut_even eq "6") {$cut_num = $subject_length - 26;}
  elsif ($cut_even eq "8") {$cut_num = $subject_length - 26;}
  else {$cut_num = $subject_length - 25;}

  for ($count = 0; $count < $cut_num; $count++)
  {
   chop($subject);
  }
  $subject_abb = "$subject ...";
 }
 else{$subject_abb = "$subject";}

題名が26文字以上だとちょん切るようにしたいのですが…上のif構文が
少々まどろっこしいのはif ($cut_even eq "0" || $cut_even eq "2"…)が
現在のUNIXサーバー(Prohosting)では何故か使えないためなんです
けど、それはともかく、どうすれば上手くいきますかね?

よろしくお願いします。

→  MacBBS

よしもと さんからのコメント
( Saturday, February 14, 1998 04:12:33 )

文字コードは何を使っていますか?
もし、SJISでしたらEUCに変えてみてください。
SJISはPerlのエスケープとぶち当たるんで、MacPerlで日本語の
処理を行う場合はEUCで行うのが無難です。

それから、chopよりchompを使うほうが少しだけど安全ですよ。

#2バイト文字でMacPerlと(コマンドもだけど)書くのだけは
#やめて欲しいなぁ :-)