2012年3月16日金曜日

Thunderbird+LightningでカレンダーのCSV形式でのエクスポート時の文字化けについて

Thunderbird + LightningでカレンダーをCSV形式でエクスポートしたら文字化けして悲しかったので、ちょっと修正してみました。


年度末でへろへろしているところに新年度の準備がががというわけで、Googleカレンダーやグループウェアのカレンダーの準備をしてたりします。

で、
  1. Googleカレンダーに自組織の来年度の予定を突っ込んでエクスポート
  2. エクスポートしたhoge.icsファイルを手元のThunderbird+Lightningに突っ込む
  3. さらにhoge.csvにエクスポート
  4. hoge.csvを編集してグループウェアのカレンダー用に加工して突っ込む
というなんともせつない手順なのですが、3の場面でエクスポートしたファイルは見事に文字化けします。

とりあえずThunderbirdとLightningを最新版にバージョンアップして何度か試してみましたが、やっぱり化ける。見事に化ける。どうしても化ける。ICSやHTML形式では化けないので、CSV形式でエクスポートした時固有の問題ぽい(日本語使っていなければ問題ないのかも)。

ちょっと調べてみると昔から文字化けしているみたいで、
修正するファイルは手元のWindows7だと
C:\Users\ユーザー名\AppData\Roaming\Thunderbird\Profiles\適当なフォルダ\
extensions\{e2fda1a4-762b-4020-b5ad-a41df1933103}\calendar-js\calOutlookCSVImportExport.js
です。

555行目からの
            str = line.join(',') + exportLineEnding;
            aStream.write(str, str.length);
これを
            str = line.join(',') + exportLineEnding;
            var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
                            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
            converter.charset = "Shift_JIS";
            var strOctets = converter.ConvertFromUnicode(str);
            strOctets += converter.Finish();
            aStream.write(strOctets, strOctets.length);
こんな感じで。

ついでに、「2012年4月1日」が「04/01/12」とエクスポートされるため、Excelが勝手に日付型に変換して2004年1月12日などとするのにも対処してみた。
といっても、64行目の
    dateFormat      : "%m/%d/%y",
これを
    dateFormat      : "%Y/%m/%d",
こうしただけ。

ファイル形式はShift JISのLFだったので、なんか適当なエディタでいじってください。UTF-8NのLFとかしたらエクスポートダイアログでファイル形式選べなかったりしたのでご注意を。