Ruby では、1 文字だけを表すことのできるクラスが存在しないため、
例えば A
という 1 文字を扱いたい場合は、'A'[0]
のように記述する必要があります。
また、Ruby 1.8 と 1.9 では、'A'[0]
と記述した場合の意味が異なることに注意してください。
(Ruby 1.8 の場合) 'A'[0] # => 65 (文字コード)
(Ruby 1.9 の場合) 'A'[0] # => "A" (1 文字の部分文字列)
'A'[0].ord # => 65
'A'.bytes.to_a[0] # => 65
'A'[0] # => 65
'A'.ord # => 65
ord
は実際には ASCII コードではなく、コードポイントを表しています。
Unicode などで、1 文字が複数バイトで表現されている場合は、ord
の返す値も 2 byte 以上の整数値になります。
65.chr # => "A"
"ABC".bytes.to_a # => [65, 66, 67]
"ABC".unpack("c*") # => [65, 66, 67]
String#bytes()
は Enumerator
オブジェクトを返すので、ASCII コードを順番に取得したければ、以下のようにブロックを使って処理できます。
"ABC".bytes {|code| puts code } # ASCII コードを順番に表示
"ABC".bytes.inject(:+) # ASCII コードの合計値を求める
バイトごとではなく、Unicode などのコードポイント単位で取得したい場合は、String#codepoints
(= each_codepoints
) が使用できます (Ruby 1.9)。
"漢字ABC".codepoints {|cp| puts cp.to_s(16) } # => 6f22 5b57 41 42 43
[65, 66, 67].pack("c*") # => "ABC"
[65, 66, 67].map {|code| code.chr}.join # => "ABC"