NKF.nkf( '-M' ) が Ruby 1.8.5 で壊れている

いわゆる mime B encode というのに使ったんだけど、1.8.5 では使えないことが分かった。

Ruby 1.8.7@OSX 10.5.7 + MacPorts

$ irb
irb(main):001:0> NKF.nkf( '-wM', 'abc' )
=> "abc"
irb(main):002:0> NKF.nkf( '-wM', '日本語' )
=> "日本語"
irb(main):003:0> NKF.nkf( '-M', '日本語' )
=> "日本語"

Ruby 1.8.5@Debian etch

$ irb
irb(main):001:0> NKF.nkf( '-wM', 'abc' )
=> "abc"
irb(main):002:0> NKF.nkf( '-wM', '日本語' )
=> "=?UTF-8?B?5pel5pys6Kqe"
irb(main):003:0> NKF.nkf( '-M', '日本語' )
=> "=?ISO-2022-JP?B?GyRCRnxLXDhs"

見て分かる通り

Ruby 1.8.5 の nkf で -M を利用すると末尾のデータが欠落する。UTF-8 しか使っていない場合は ?= を付ければ済むように見えなくないが、ISO-2022-JP の場合はもう少し削れており、復元不能。

ここでは Debian etch を例に出したが、CentOS 5 でもパッケージで入る Ruby は 1.8.5 であり、いろいろなところで安全に使える Ruby という意味では 1.8.5 がまだまだ現役だと言っていいと思う。(開発陣からは恐らく見捨てられてると思うけど。)

そうすると選択肢は以下のような感じかな。

  1. Ruby 1.8.6 以降を使え!(上には書いてないけど 1.8.6 でも大丈夫なのは確認済み)
  2. Ruby では mime B encode には期待しない(header には日本語入れない)
  3. encode 自体は pack だけでとりあえず済まし、fold しない(当然、ちゃんと送れる保証はない)
  4. ActionMailer とか大きなライブラリを利用する

大きなアプリの中で使うなら 4 でもいいんだけど、ちょっとしたツールでは大げさだよねぇ。

今回改めて mime B encode というか mail header の `encoded word' 辺りを調べてみたけど、面倒くさいねぇ、これ。

More