東港研究所給湯室-海のルアーフィッシング休憩室-

エントリー

2009年07月の記事は以下のとおりです。

[改造]タイトルの文字数を制御するスクリプト-WebDiaryPro

先日は苦労の末、UTF-8の文字数orバイト数のカウントに小一時間悩みましたが、何とか解決。

 
 さて、WebDiaryProでは、タイトルをJavaScriptで書き出す機能がありますので、非常に重宝しますが、記事のタイトルが長い場合に、全体のレイアウトを崩していしまう現象が起きます。

 そこで、タイトルが一定の長さ以上になった場合に、一部を省略するように改造してみたいと思います。

例(9文字後は省略)
「長すぎるタイトルを省略するスクリプト」

「長すぎるタイトルを....」

こんな感じですね。 


 長いタイトルを短くするスクリプトです。


lib/webliberty/app/diary.pm

1893行目付近


open(FH, "$self->{init}->{data_diary_dir}$entry") or $self->error("Read Error : $self->{init}->{data_diary_dir}$entry");
while () {
chomp;
my($no, $id, $stat, $break, $comt, $tb, $field, $date, $name, $subj, $text, $color, $icon, $file, $host) = split(/\t/);

if (!$stat) {


open(FH, "$self->{init}->{data_diary_dir}$entry") or $self->error("Read Error : $self->{init}->{data_diary_dir}$entry");
while () {
chomp;
my($no, $id, $stat, $break, $comt, $tb, $field, $date, $name, $subj, $text, $color, $icon, $file, $host) = split(/\t/);


utf8::decode($subj);
if (length $subj >= 14){$subj = substr($subj,0,14)."...."}
utf8::encode($subj);

if (!$stat) {

 この改造スクリプトでは14文字以上になった場合15文字目から削除するようになっています。

 文字数を変更したい場合は、下線部分(14)の部分を変更してください。

utf8::decode($subj); でデコードしてutf8::encode($subj);で再度エンコードしてやればいいんですね。

以上!

UTF-8のencode、decodeで小一時間悩む-CGI,Perl

 先日、トップページをJavaScriptで自動書き換えするコードを公開しましたが、タイトルが長い場合にレイアウトを崩してしまう現象が発生しました。

 回避するためのコードを見つけるのにチョッと悩むw

UTF-8ベースだとlength、substrを使うと場合によっては文字化けしてしまう。

Win2000からは、UNICODEが標準とされたため、今まで作ってたEUCベースから転換しなければならないのかも。

少し脱線しましたが、UTF8を始めて扱って気が付いたんですが、EUC、SHIFT-JISは全角文字を2バイト、半角文字を1バイトで計算するだけど、UTF8で計算すると全角文字が3バイト、半角が1バイトなんだよね。

 技術的な事はググってくださいw


要するに、

1111 は4バイト
あいうえお は15バイトになってしまうわけで・・・
あ1も 4バイト

バイト数で区切ってしまうと端数が出てきて文字化けするみたいですね。 もう少し研究してみます(汗)

 

そこで一旦、UTF-8をデコードして計算後にエンコードする方法をとってみました。


utf8::decode($str);

utf8::encode($str);

これで、バイト数ではなく文字数をカウントして、SubStr関数を使えば、文字数で区切ることが可能となります。


忘れないように記録しておこう。

参考サイト


以上!

ページ移動



ユーティリティ

検索

エントリー検索フォーム
キーワード

ありがとうございます

新着画像

Feed