« 2005年05月16日 | メイン | 2005年05月18日 »

2005年05月17日

全角英数字 ⇔ 半角英数字

全角英数字を半角英数字に変換するときは、どのような方法を使っていますか?僕は jcode.pl をずっと使っていました。というか jcode.pl は、手放せないライブラリだったわけです。

&jcode::tr(\$text, '0-9A-Za-z', '0-9A-Za-z');

しかし、常々、正規表現で書くことは出来ないのかと考えていたわけです。書きました。

Perl メモ より

$a = qr{(?<!\x8F)};
$b = qr{(?=(?:[\xA1-\xFE][\xA1-\xFE])*(?:[\x00-\x7F\x8E\x8F]|\z))}x;

全角英数字 → 半角英数字

$text =~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg;

半角英数字 → 全角英数字

$text =~ s/([0-9A-Za-z])/pack("C*", 0xA3, ord($1) + 0x80)/eg;

Perl で pack や ord を使う機会がほとんど無いけど、今回のために調べたり。というか、自分がコードを書くときに使ったのは、これがはじめて。

もっといい方法は無いかな。

【関連情報】
・Perlメモ
 http://www.din.or.jp/~ohzaki/perl.htm

22:26 | コメント (4) | トラックバック | Programming

EUC の正規表現

最近は、ニュース検索に新たな機能を追加しようと試行錯誤しています。

EUC の文字列が文字化けしていないかどうかをチェックする必要がありました。チェック自体は難しくなく、単に EUC の範囲外の文字が含まれているかどうかを調べればよいのです。

EUC の 1byte 文字は、以下のように表現することが出来ます。というか、すべての ASCII 文字 はこれ。

[\x00-\x7F]

しかし、よくよく考えると、この表現には制御文字も含まれているんですよね。なので、このままマッチさせると文字化けを発見することが出来ないわけです。なので、制御文字を除いてマッチさせるのが吉だと思う。

[\x20-\x7E]

ということで、僕は、以下のように定義して文字化けが無いかどうかを調べています。

$euc = '[\x20-\x7E]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]';
if ($text !~ /^(?:$euc)+$/o) {
    print "化けてるよ!";
}

もっといい方法が無いものだろうか。

22:12 | コメント (0) | トラックバック | Programming

一食の生活が続きます

だめぽ。ということで、昨日(16日)の食事内容です。
夜は、自宅でカレーうどんを作った。カレーライスを作ろうかと思ったけど、皿を洗うのが面倒なので断念する。仕方が無い。というかだな、食事回数が減っている最中に体力測定とかするもんじゃないな。貧血になっちまったよ。

自宅 (夜)
 カレーうどん

04:00 | コメント (0) | トラックバック | Meal