2004年04月05日(月) [過去の今日]
#1 perlのマルチバイト文字のマッチング
5.8くらいになればもう完全対応だろうとかタカを括ってたのだが、どうもそうもいかないらしい。日本語の「あ」は正規表現の/../にマッチしたりする。つまり二文字として扱われてるわけだな。そういうわけで /[??]/ なんてのがうまくマッチしてくれなくて悩んでた。
そしたらIRCで やすたん からアドバイス。use Encode; とか use utf8; あたりじゃないのみたいな話を教えてもらった。Encodeは変換ライブラリかな。とりあえず use utf8; し、スクリプトをUTF-8で書いてみると、見事に正しくマルチバイト文字が扱われてた。なるほど、perl 5.8 はそういう解決か。これからはperlはUTF-8で書くことにするしかないかな。
(@709)
@ 翌日追記:
ということでperlスクリプトを編集するときは基本的にUTF-8にしちまおう。hookを使ってこうしてみた。
(add-hook 'perl-mode-hook (lambda () (set-buffer-file-coding-system 'utf-8-unix)))
うしうし、うまくいったな。ってまてよ。これじゃ今まで書いたスクリプトも開いたとたんにUTF-8にされちまうじゃねえか。んー、回避策はあるのかな?
(@020)
@ さらに追記:
とりあえず開いたときにバッファサイズが0ならUTF-8、という解決。
(add-hook 'perl-mode-hook (lambda () (if (<= (buffer-size) 0) (set-buffer-file-coding-system 'utf-8-unix))))
んー、でもどうせなら、バッファ内にマルチバイト文字が存在するか否かで判定したいよなあ。そういう処理どうやればいいんだろう。
(@067)
@ Encode必須:
むう、最初から全部UTF-8ならいいんだけど、他の文字列持ってこようとするとダメダメだな。JocdeでUTF-8にしても日本語を使った正規表現にマッチしなくなる。なぜかEncodeを使ってUTF-8にdecodeしてやらにゃならん。でもどっちを使っても変数に入ってるデータは同じなんだけどなあ。謎い、謎過ぎる。perl-techネタか?
というか、5.6.1ではどうしたらいいんでしょうね。woodyではきっついなあ。
(@272)