M17N関連で困ったこと

先述のエントリと関連してますが、内容が異なるので別エントリとして。

ruby-1.9.1-p0を使ってて、いろいろ困ったことを書き連ねておきます。

1.9で動くけど、M17Nとして正しい挙動じゃないGem

1.9対応したというSequel(2.11.0)を使っていて、
SQLiteから取得したクエリの中身(textやstring)が、
実体はUTF-8なのに、String#encodingはASCII-8bitとなっている。
なので、いちいち取得した後でString#force_encoding(Encoding::UTF_8)しないといけない。
たぶん、ruby-1.9で動くように対応したのだろうけど
M17N対応はできていないみたいだ。

以下、1.9対応をうたうGemを使ってて感じたこと。

  1. とりあえず、1.9で動くようになったもの
  2. 1.9でエラーや警告がでないことを以って、1.9対応したもの
  3. M17Nとしてきっちり挙動するところまで対応したもの
  4. MiniTestまできっちり対応したもの

……と、いろいろあるようだ。
海外のGemは、M17Nまできっちり対応してるものは少ないのかもしれない。
現に、Sequelはそんな感じだった。

DummyEncodingは正規表現マッチできない

DummyEncodingなString。たとえば、ISO-2022-JPなんかだと、正規表現が使えない。

#!ruby -U

str_jis = "ほげ".encode(Encoding::ISO_2022_JP)
if /hoge/ =~ str_jis
  puts "match!"
end

なんていうことをやろうとすると、
Regexp CompatiblirityError が起きてしまう。
Encoding::ISO_2022_JPはDummyEncodingなので文字列としては扱えない。
このため、こんなエラーが起きてしまうようだ。
こういった場合は、一時的に別のエンコーディングへ変更してマッチさせるしかない。

#!ruby -U

str_jis = "ほげ".encode(Encoding::ISO_2022_JP)
if /hoge/ =~ str_jis.encode(Encoding.defualt_internal)
  puts "match!"
end

これならマッチできる。