まくまくRubyノート
ASCII コードと文字を変換する (ord, chr, bytes, unpack, codepoints)
2011-12-05

前提知識(Ruby における文字の表現方法)

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 文字の部分文字列)

文字 → ASCIIコード

Ruby 1.8 / 1.9 共通の方法

'A'[0].ord  # => 65
'A'.bytes.to_a[0]  # => 65

Ruby 1.8 以下でのみ使用できる方法

'A'[0]  # => 65

Ruby 1.9 以上でのみ使用できる方法

'A'.ord  # => 65
ord は実際には ASCII コードではなく、コードポイントを表しています。 Unicode などで、1 文字が複数バイトで表現されている場合は、ord の返す値も 2 byte 以上の整数値になります。

ASCIIコード → 文字

65.chr  # => "A"

文字列 → ASCIIコードの配列

"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

ASCIIコードの配列 → 文字列

[65, 66, 67].pack("c*")  # => "ABC"
[65, 66, 67].map {|code| code.chr}.join  # => "ABC"
2011-12-05