Rubyとマルチバイト文字列

Ruby1.9に乗り変えようとしたら、案の定マルチバイト文字列の付近ではまっているのでメモ。初めてのRubyとか見つつ。

Ruby1.8

  • 文字列は単なるバイト列
  • $KCODE対応しているメソッドは$KCODEの値によって振舞いを変えることがある
    • String#inspectとか
  • 正規表現オブジェクトのほうは日本語に対応している
    • 「.」は1バイトではなく1文字
  • 内容は同じ文字列でもエンコーディングが違うと異なる文字列として扱われる

Ruby1.9

  • 文字列は単なるバイト列ではなく、真の意味での「文字の列」
  • Stringオブジェクトは自身のエンコーディングを知っている
    • lengthもそれを考慮した文字の数を返す
  • エンコーディングに関わってくるのは、入力、出力、内部表現
  • マジックコメント(Shebangとか)でソースコードがどの方式でエンコードされているかを判定
  • String#encodeメソッドで文字列を可能ならコード変換することができる
    • 失敗した場合はArgumentError例外が発生
  • force_endodingメソッドはバイト列表現は変化させず、エンコーディング情報だけを変更する
  • エンコーディングが違う文字列同士は結合することができない
  • 文字列は、バイト表現が同値かつエンコーディングも同じ場合に限り同値

その他

もうちょっと詳しく知らないといけないなと思ったので、プログラミング言語 Rubyとか引っぱり出す。

  • 正規表現にもエンコーディングがある
    • //nとか//uみたいな感じ
    • 指定しない場合はソースエンコーディングが使われる