Ruby 1.9.0 の M17N メモ

This entry was posted by on Friday, 28 December, 2007

というわけで、ちょっとだけ調べてみた。ちょっとだけすぎるけど。

Ruby は 1.9 になって M17N になった。 1.8 系の Ruby では String は実質的にバイト列のことだったが、 1.9 系では文字の扱いができるようになっている。逆にバイト列として扱う場合には面倒なことになる可能性がある。

さて、文字列ということで文字コードのことを知らなければならなくなった。 String には encoding、 encode、 encode!、 force_encoding というメソッドが追加されている。 encoding は現在の文字コードを返す。 force_encoding は指定した文字コードとして解釈しなおす。 encode は文字コードを変換する(encode!は encode の破壊的変更版)。文字コードは Encoding オブジェクトを受け渡しするが、文字列で渡しても適当に変換してくれるようだ。

既存のメソッドだと length は文字数を返すように変更されている。 bytesize メソッドを使えばバイト数が返される。

ファイルからデータを読むときは、特に指定がなければデフォルトの文字コードであるとみなす。指定するには "r" のようなモード指定のときに "r:euc-jp" のようにコロンをつなげる。 "r:euc-jp:utf-8" と2つ指定すると、読むときに自動的に変換してくれる(この場合は euc-jp から utf-8 へ)。

デフォルトの文字コードは、 ruby に -Ks などのように -K オプションを渡すか、 –ecoding オプションで渡す。どちらもなければ locale から決定する。デフォルトの文字コードは Encoding.default_external メソッドで確認できる。

文字コードの自動認識については、 Kconv.guess がきちんと動く(ちゃんと Encoding オブジェクトを返す)ようだ。ちなみに Kconv の文字コード変換はふつうに動作して、きちんと encoding も変換後のものにしてくれるみたい。

なお、 ruby 1.8 系と同じように動作させるときには、文字コードをバイナリとみなす(読み込み時に "rb" のように指定するか、 force_encoding(Encoding::Binary) を実行する)といいんじゃないかという気がする。

むむ、 p が文字をエスケープしてくれないんですが……!

とりあえずこんなところかな。

Comments are closed.