Ruby1.9に乗り変えようとしたら、案の定マルチバイト文字列の付近ではまっているのでメモ。初めてのRubyとか見つつ。
Ruby1.8
- 文字列は単なるバイト列
- $KCODE対応しているメソッドは$KCODEの値によって振舞いを変えることがある
- String#inspectとか
- 正規表現オブジェクトのほうは日本語に対応している
- 「.」は1バイトではなく1文字
- 内容は同じ文字列でもエンコーディングが違うと異なる文字列として扱われる
Ruby1.9
- 文字列は単なるバイト列ではなく、真の意味での「文字の列」
- Stringオブジェクトは自身のエンコーディングを知っている
- lengthもそれを考慮した文字の数を返す
- エンコーディングに関わってくるのは、入力、出力、内部表現
- マジックコメント(Shebangとか)でソースコードがどの方式でエンコードされているかを判定
- String#encodeメソッドで文字列を可能ならコード変換することができる
- 失敗した場合はArgumentError例外が発生
- force_endodingメソッドはバイト列表現は変化させず、エンコーディング情報だけを変更する
- 「実用上はむやみなforce_encodingは控えるべきで、encodeが適切なケースが多い」と書いてあった
- エンコーディングが違う文字列同士は結合することができない
- 文字列は、バイト表現が同値かつエンコーディングも同じ場合に限り同値
その他
もうちょっと詳しく知らないといけないなと思ったので、プログラミング言語 Rubyとか引っぱり出す。
- 正規表現にもエンコーディングがある
- //nとか//uみたいな感じ
- 指定しない場合はソースエンコーディングが使われる