Thunderbirdのabook.mabなどのわけ分からん内容のファイルはFile::Morkを使って復元できる

2011-11-14 バグを見つけたので追記
あー。これ書いたのid:hakobe932だったのね。
File::Morkモジュールのマルチバイト対応 - はこべにっき ♨

      • -

Thunderbirdのabook.mabなどのわけ分からん内容のファイルはFile::Morkを使って復元できる。
ところがFile-Mork-0.3でこんなエラーが出た。

Unknown encoding 'UTF-16$E3$82$84$E3$81$BE$E3$81$A0$E3$81$95$E3$82$93' at File/Mork.pm line 346

バイトオーダー判定の正規表現が"$BE"という文字列にマッチしてしまって、$self->{byte_order}がおかしくなる。
やっつけ修正したけど、これで合ってるかどうか知らんので自己責任で。
バグレポートはしてないので誰かもうちょっとマシなパッチ作ってレポっといて。

--- File/Mork.pm.orig   2010-03-25 13:14:48.065636000 +0900
+++ File/Mork.pm        2010-03-25 13:18:47.790343200 +0900
@@ -333,7 +333,7 @@
         }

         # recognize the byte order of UTF-16 encoding
-        if (! defined ($self->{byte_order}) && $val =~ m/(?:BE|LE)/) {
+        if (! defined ($self->{byte_order}) && $val =~ m/[^\$](?:BE|LE)/) {
             $self->{byte_order} = $val;
         }

2011-11-14 追記

上記の対応をしても、例えば Message-ID: KOBE0123@example.com だと
$self->{byte_order}="UTF-16KOBE0123@example.com"
みたいになってしまう。
しかもこれはThunderbirdのmsfファイルで起きるんだけど、msfファイルはUTF-16じゃなくてUTF-8なんだな。


なので↑のパッチはダメだった。
手元にhistory.datが無いのでUTF-16なmorkとUTF-8なmorkに同時対応させるのが難しく(検証できない)、いっその事decodeを書きちゃえようと思ってこうした。

*File::Mork::decode = sub($$;$) {
    $_[0] = 'UTF-8' if $_[0] !~ /UTF-16[BL]E/;
    goto &Encode::decode;
};

多分UTF-16なmorkには"UTF-16BE"とか"UTF-16LE"とか入ってると思うので、元々のid:hakobe932のパッチの判別式を/(?:BE|LE)/じゃなくて/UTF-16(?:BE|LE)/にすればいいんじゃないかなとか思うのですがどうなんですかね。
ちなみにエンディアンについてはこちら→108134 - history database is endian; corrupts the display of titles