[僕] ruby 1.8 の正規表現でバイト列じゃなくて文字列でマッチする

僕ト云フ事

たろマークはてなブックマーク

2011年02月26日

[citrus][ruby] ruby 1.8 の正規表現でバイト列じゃなくて文字列でマッチする

mobitaro のバックエンドに使い始めた Citrus で、IRC に貼られた URL にあるタイトルを表示する機能があるんですが、woremacx さんから、長いタイトルが変なところで区切られてるという指摘を受けて見てみた。

たとえばこんな感じ。

Ruby 1.9 で日本語(マルチバイト)の文字列を扱�... [text/html; charset=euc-jp]

結論から言うと plugins/http/default.rb の 89 行目、正規表現で60文字までマッチさせて ... をくっつけてるところを u フラグ立てるようにしたら解決。


                if title.size > 70
                        title = title[/.{0,60}/u] + "..."
                end

ruby 1.8系の正規表現は $KCODE の値に従うか、オプションをつけることで文字コードを指定できるみたい。

リテラル/正規表現リテラル

Ruby は日本語化されているので、$KCODE の値に従って正 規表現中の日本語文字を正しく扱います。$KCODE = "n" の場合、日本 語文字を一切認識せずにバイト列として扱います。これはデフォルトの動作で す。

オプションとして n, e, s, u のいずれかを指定す ることで正規表現の文字コードを $KCODE の値に関係なく 個々の正規表現リテラルに指定することもできます。

あと、この問題を追及してるときに、String オブジェクトに to_u8 ってメソッドが生えててなにこれ、と思ったら、lib/citrus/utils.rb にあると、woremacx さんに教えてもらった。オープンクラスで再定義、なるほどー。

blog comments powered by Disqus