Ruby1.8系における1バイト(文字)と文字リテラルの関係

バイトってなんだろう?

Rubyを習得中、Stringクラスの演算子"<<"の説明に次の記述を見つけた。

0から255までのFixnumである場合はその1バイトを末尾に追加する。

言っている意味が分からない・・・。特に「1バイト」に関する理解が不足している。「『1バイト=8ビット』の単位のことでしょ?」という訳ではなさそうだ。
よく考えてみれば、今まで「『ひらがな』はマルチバイト文字。」と分かったように使っていたが、「バイト」とは「文字の表現方法」であり、その意味は深く考えたことがなかった。
というわけで、恥を忍んで、文字の中でも「1バイト」に絞って調べてみた。また関連して、Rubyの「文字リテラル」についても調べてみた。

1バイト文字とは*1

1バイト(8bit)のデータで表現できる文字。半角の英数字や記号、半角カタカナなどが含まれる。

Ruby1.8系における文字リテラルとは*2

その文字(バイト)の文字コード値のこと。

Ruby1.8系で1バイト文字を文字リテラルで表す

例えば、"a"は次のようになる。

# irb
irb(main):001:0> ?a
=> 97

ここまで理解したうえで、改めて、冒頭のStringクラスの演算子"<<"の挙動を調べてみる。

Stringクラスの演算子"<<"の挙動

定義

文字列(String)クラスの演算子"self << other"は、文字列オブジェクトotherが、0から255までのFixnumクラスの数値リテラルの場合、数値リテラルを1バイト(文字)として、selfに連結する。

動作例その1(1バイトの代入)

「はじめてのRuby」p.58 例4-1のコード"ex401.rb"を次に示す。

str = String.new
str << 72 << 101 << 108 << 108 << 111
p str
puts "str[0] = #{str[0]}"

ex401.rbを実行すると次のとおり。

# ruby ex401.rb 
"Hello"
str[0] = 72
動作例その2(文字列リテラルの代入)

続いて、文字列リテラルで各文字を記述して連結する方法"ex401r.rb"を次に示す。

str = String.new
str << "H" << "e" << "l" << "l" << "o"
p str
puts "str[0] = #{str[0]}"
p

ex401r.rbを実行すると次のとおり。

# ruby ex401r.rb
"Hello"
str[0] = 72
動作例その3(文字リテラルの代入)

最後に、文字リテラルで各文字を記述して連結する方法"ex401rr.rb"を次に示す。

str = String.new
str << ?H << ?e << ?l << ?l << ?o
p str
puts "str[0] = #{str[0]}"

ex401rr.rbを実行すると次のとおり。

# ruby ex401rr.rb
"Hello"
str[0] = 72

振り返って

Ruby1.8系では、「文字」は「文字リテラル」で表現すると「バイト」で表現される。「文字列リテラル」も、文字列の添字アクセスした際も、添字のバイト位置にアクセスし、その位置のバイト値を返す。マルチバイト文字の扱いや、1.9系の処理の違いは、またいつの日か。