Ruby1.8系における1バイト(文字)と文字リテラルの関係
バイトってなんだろう?
Rubyを習得中、Stringクラスの演算子"<<"の説明に次の記述を見つけた。
0から255までのFixnumである場合はその1バイトを末尾に追加する。
言っている意味が分からない・・・。特に「1バイト」に関する理解が不足している。「『1バイト=8ビット』の単位のことでしょ?」という訳ではなさそうだ。
よく考えてみれば、今まで「『ひらがな』はマルチバイト文字。」と分かったように使っていたが、「バイト」とは「文字の表現方法」であり、その意味は深く考えたことがなかった。
というわけで、恥を忍んで、文字の中でも「1バイト」に絞って調べてみた。また関連して、Rubyの「文字リテラル」についても調べてみた。
1バイト文字とは*1
1バイト(8bit)のデータで表現できる文字。半角の英数字や記号、半角カタカナなどが含まれる。
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
振り返って
Ruby1.8系では、「文字」は「文字リテラル」で表現すると「バイト」で表現される。「文字列リテラル」も、文字列の添字アクセスした際も、添字のバイト位置にアクセスし、その位置のバイト値を返す。マルチバイト文字の扱いや、1.9系の処理の違いは、またいつの日か。