iso tank - blosxom 2008年 01月

foreshortened改造 3かいめ

1/30追加

ちなみに昨日仕事中にゲームの遊び方について訊ねて来た隣の人は、昨日の午後、突然高熱を発してお倒れになられた。今日は休んだ。風邪である。

でPerlです。blosxomです。ようするに朝から今まで「データをバイト単位で区切る関数は存在する(substrなど)けど、文字単位で区切る関数は存在しない」ことに頭を悩ませていたのです。

どういうことかっていうと、Perlは文字列を扱うのがとても上手なくせに、文字の数を数えるのが苦手なのです。でもこれPerlのせいじゃないとおもうけどね。先述のsubstrという関数はデータをバイト単位で区切るもんだから、つまりマルチバイト文字の後ろのほうだけ削ってしまっても気づかないので、最後の文字がそのまま化けて表示されてしまう。

普通にHTMLで表示する分には「あー文字化けしてやんのあはは」で済むんだけどこれがRSSとかのいわゆるXMLで扱おうとするとだいぶうまくない。XML全体としてエラーを吐き出してしまうのでRSSとかがまったく機能しなくなる。

で、なにをしてるのかっていうと「ブログの記事の最初の方を抜き出して要約文として仕立て上げること」をやっているんですけどね。blosxomでいうところのforeshortenedってやつ。本文短縮化プラグインです。

英語の場合1バイト文字しかないからsubstrで問題ない。ひらがな・かたかなは2バイト、漢字にいたっては3バイトと、バイト数がばらばらなんでこれが非常にやっかい。考えた。拙者かなり考えた。むむむむむ、む。

そういや先日、PythonいじりまくってURLエンコード/デコードするCGI作ったじゃないですか。あれってどうやったっけ。あれ? あれって? んんん。おやおや?

日記を見返すと、URLエンコードするのに「UTF-8文字列→Unicodeにデコード→他の文字列にエンコード→URLエンコード」という方法をとっていた。そうそう、そうそうそう。

じゃあさ、文字を区切るのに「UTF-8文字列→内部文字列にデコード→文字列をチョン→UTF-8にエンコード」ってしたらどうなるよ? よ? よ。

ググった。PerlのモジュールのひとつにEncodeっていうのがある。確かよくJcodeとくらべられるやつだ。めんどくさいからそういうことしなけりゃいいじゃんってことでほっぽってたので忘れてた。

つまりこう。

$STR = encode('utf-8', substr(decode('utf-8', $STR), 0, $LENGTH));

結果は◎。大成功。やべ、俺神すぎ\(^o^)/なわけない。結局substrで文字単位で文字列を区切ることができたわけだ。気付け。調べろ。俺。ばかうんこ。

そんなわけでRSSのdescriptionタグにこれで短縮化した文字列をはめこむことができるー。ちなみにcontent:encodedはあまりにもデータ量が大きすぎるので削った。いいよね?

さーて次はmixipostを何とかしたいなぁ。仕事? やらん。

(1/28追記)foreshortened本体のソースはこんな感じになったコード的に間違ってないといいんだけど。