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.9で動くようになったもの
- 1.9でエラーや警告がでないことを以って、1.9対応したもの
- M17Nとしてきっちり挙動するところまで対応したもの
- 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
これならマッチできる。