文字コードと文字の変換

mixiRuby コミュと 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 脳でプログラミングしてると滅多に必要ないんだけどね。