2012年5月25日金曜日

Yahoo のリッチテキストメールと Mms.apk

Yahooメールからのリッチテキストメールも文字化けするとTwitterで報告いただいたので調べました。

とりあえず、試しにiPhone宛に送ってみるとGmailのときと同様にまったく受信できませんでした。(異界送りになる)
これについてはSoftbankに報告したほうがいいかもしれません。
参考までに一般のメールアドレスに送ると、iso-2022-jpのHTMLになってますが、これはあまり参考になりません。(MMSはサーバで変換されるので)

さて、Yahooメールでリッチテキストメールを送ると、SoftbankのMMSサーバはShift_JISのHTMLメールとして端末へ送るようです。
Gmailのときと違い、ちゃんと文字コードが指定されているにもかかわらず、メッセージアプリでは文字化けしてしまいます。

いろいろ調べていると、frameworkのPduPersister(dbにメッセージを保存するクラス)がバグっておりました。
こいつは charsetを全く見ずに、バイトデータをDefault Encoding(UTF-8)のつもりでString化し、dbのTEXTフィールドにつっこんでます。
dbから読み取るときも同様に、UTF-8文字列としてバイトデータ化しています。
これを メッセージアプリは送られてきた元々のcharset情報により、Shift_JISのバイトデータとして複合しようとします。
まぁこんなことしてたら2バイトデータはぶっ壊れて文字化けします。

そんなわけで、手っ取り早く対応するにはShift_JISのHTMLパートをすててalternativeとしてくっついてるUTF-8のテキストパートを使う…
というのでもいいのですが、納得いかないのでAOSPにframeworkを修正するパッチを送りました。

Mms.apkではPersisterに渡る前にUTF-8に変換して、charset情報もUTF-8にしてしまうという手段を取りました。
これならframeworkの修正がなくても対応できます。
そもそも、Shift_JISのSoftbank絵文字はそのままUTF-8に変換できないので特別に変換関数を用意して自前で変換する必要があり、frameworkがなおっても必要なプロセスになります。
ともかく、これでHTML表現を維持しつつ文字化けが解消できました。

ついでに、Sense系ROMで報告いただいてるExceptionをできるかぎり潰したものを作りました。
テスト環境がないので動くかわかりませんが、お試しください。
ABSOLUTELY NO WARRANTY です。

ダウンロード (20100908)

0 件のコメント:

コメントを投稿