« スキーは楽しい(けつね) | 言語と思考 »

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本体のソースはこんな感じになったコード的に間違ってないといいんだけど。

« スキーは楽しい(けつね) | 言語と思考 »

foreshortened改造 3かいめ への Writeback

名前:

URLまたはE-Mail:(※リンク表示注意)

コメント:

情報をクッキーに保存する

trackback URI:

http://iso.tank.jp/blosxom/plugins/foreshortened_modify3.tarako

Search

Option

Document

Comment

アイテム詐欺で「再」逮捕
04/14 : Lela Guzman
05/07 : Elisa Brown
春よ、来い
05/08 : simuzy
05/08 : simuzy
05/12 : そうこ
05/04 : パニック障害
カテゴリ名変更&新しい楽器がふえたよ
02/14 : そうこ
06/26 : 室井
08/20 : そうこ
09/22 : そうこ

Tackback

リタリンの処方が打ち切られた
03/27 : ノビじいの鬱々日記
foreshortenedプラグイン改造
01/23 : ISO TANK!

Log

2008年
2月 1月
2007年
4月 3月 2月 1月
2006年
12月 11月 10月 9月 7月 2月 1月
2005年
11月

Link