«前の日記(2006.10.08 / Sunday) 最新 次の日記(2006.10.10 / Tuesday)» 編集

Hena Hena Nikki

2003|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|10|11|12|
2012|01|02|03|04|05|06|07|08|10|12|
2013|01|02|04|06|

2006.10.09 / Monday [長年日記]

* [computer] Shift_JIS 環境の Ruby スクリプトで文字列処理を行う時の注意

正規表現処理を経由している時はちゃんとマルチ・バイトであることを考慮してくれるけど、 バイト列として直接見に行くと痛い目に遭う可能性がある。

#! /usr/bin/env ruby -Ks
value = '文字列の表示で苦労する。' key = '\\'
puts "\"#{value}\" という文字列には、文字列 \"#{key}\" が…"
print "(1) 直接バイト列として見たときは、" if value.include?(key) then puts "含まれています。" else puts "含まれていません。" end
print "(2) 正規表現処理を経由して見たときは、" if Regexp::new(Regexp::quote(key)) =~ value then puts "含まれています。" else puts "含まれていません。" end
"文字列の表示で苦労する。" という文字列には、文字列 "\" が…
(1) 直接バイト列として見たときは、含まれています。
(2) 正規表現処理を経由して見たときは、含まれていません。

これは、昨晩某所で ohai さんに教えていただいたことを試しただけで、 自分で気付いたわけではない。

後述する様に、この問題は UTF-8 なら考えなくて済む。 僕は UTF-8 の性質を知らなかった (+α) ので、昨晩、 ある自作スクリプトについてちょっと悩んでしまった…。

* [computer] UTF-8 の特徴

これも昨晩知ったこと (Wikipedia などで調べた)。 たぶん多言語処理を意識し出した人間ならすぐに調べるものなのだろうが、僕はしてなかった…。 あかんよなぁ…。

  • バイト列の任意の位置から、全ての文字境界を容易かつ確実に判定できる。
  • 文字列の探索を、単なるバイト列の探索として行っても、文字境界と異なる箇所でマッチすることがない。

ビット・パターンの特徴からこれらが導き出される。

以下、ビット・パターンの特徴を利用して、文字を一つ一つに分解する Ruby スクリプト (深い意味はありませんし、無駄なものなのですが…)。

#! /usr/bin/env ruby -Ku
def my_split(arg) val = Array::new pt = 0 arg.length.times {|n| next if n == 0 # 手抜き…。 if arg[n] < 0x80 or 0xC0 <= arg[n] then val << arg[pt, n - pt] pt = n end } val << arg[pt..-1] return val end
arr = my_split('マルチ・バイト系の文字コード処理は, 案外難しいものです.')
arr.each {|v| puts v }

* [computer/update] SQLite ver.3.3.8

軽量コンパクトな SQL データベース・エンジン。 約 2 ヶ月ぶりの version up。

* [computer/update] Mozilla Firefox 2.0 RC2

定番の multi platform な web browser。 所謂人柱版。

* [computer/update] Mozilla Firefox 2.0 RC2 日本語版

multi platform な web browser, Firefox の日本語版。 所謂人柱版。

* [computer/update] LimeChat ver.2.16

Windows 上で動く高機能 IRC client。 約 2 ヶ月ぶりの version up。


  • この日記には本日 名の方が訪問してくださっているようです。 また、昨日は 名の方が訪問してくださったようです。
  • この日記の更新情報の取得には antenna.lirs を利用するのがおすすめです。