文字コードと文字の変換
mixi の Ruby コミュと ruby-list ML で同じような話題があったのでメモ。
C 言語脳でプログラミングすると、文字を数値として扱いたくなる場面がある。
Ruby 1.8 の頃は、文字列はバイトストリームだったので、C 言語っぽいコードが書けた。
RUBY_VERSION # => "1.8.7" "A"[0] # => 65 (0x41) 0x41.chr # => "A" "檜"[0] # => 219 (0xdb) "檜"[1] # => 216 (0xd8) 0xdb.chr + 0xd8.chr # => "檜"
Ruby 1.9 からは、文字列は文字の集まりになった。
String#[] で文字コードをくれなくなった。
文字コードは String#ord で取得できる。
RUBY_VERSION # => "1.9.1" "A"[0] # => "A" 文字コードは取れない "A".ord # => 65 (0x41) 0x41.chr # => "A" "檜"[0] # => "檜" 文字コードは取れない "檜".ord # => 56280 (0xdbd8) 0xdbd8.chr # ~> `chr': 56280 out of char range (RangeError) 0xdb.chr + 0xd8.chr # => "\xDB\xD8" なにそれこわい (0xdb.chr + 0xd8.chr).force_encoding("euc-jp") # => "檜"
Ruby 脳でプログラミングしてると滅多に必要ないんだけどね。