正規表現処理を経由している時はちゃんとマルチ・バイトであることを考慮してくれるけど、 バイト列として直接見に行くと痛い目に遭う可能性がある。
#! /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 の性質を知らなかった (+α) ので、昨晩、 ある自作スクリプトについてちょっと悩んでしまった…。
これも昨晩知ったこと (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 }
軽量コンパクトな SQL データベース・エンジン。 約 2 ヶ月ぶりの version up。
定番の multi platform な web browser。 所謂人柱版。
multi platform な web browser, Firefox の日本語版。 所謂人柱版。
Windows 上で動く高機能 IRC client。 約 2 ヶ月ぶりの version up。