FlashLite1.1を通してmailtoする際にsubjectやbodyに日本語を含めたい場合、完全には文字化け問題を解決できない

FlashLite1.1を通してgetURL("mailto:")した時にsubjectやbodyに入れた日本語が文字化けする。
後学のためになればと、調査した結果報告メールの一部を引用してエントリーする。


(実機が手元に少ないため、言い切るには情報不足だし結論も憶測の域を出ないのですが、もうこれはこの記事を見て「そうじゃないよ」と言ってくれる人を待つしかないと思うので書きます。完全に鵜呑みにはしないでください)


実機ではN-04B、N-05Bで文字化けを再現した。
調べていくと、ドコモSTYLEシリーズのN-02AF-09Aなど特定の機種では同様の文字化けが起きるケースがあるとの記事を発見した。
続・Flash Lite1.1からメーラー起動メモ - alt-scape weblog
http://blog.alt-scape.com/archives/344


F-09AN-02Aなどの簡体字繁体字に対応した端末だけは文字化けを起こします。これは調査中。"
でも2009年の記事なのよね…。そして続報が見つけられなかった。


自分が出した結論を先に述べると、
「FlashLite1.1ではN-04B等特定の携帯に対する文字化け対応は不可能。
mailtoリンクを置くページはHTML出力しなくてはならない。」


主に以下二つの実機でテスト。
N-04B(FlashLite3.x 内部FlashPlayerのバージョンは9)
SO-903i(FlashLite1.1 内部FlashPlayerのバージョンは5)
以下がテストした結果。
文字化けした場合は×、問題なく表示された場合は○と表記する。


============================================
[N-04B]
■HTMLレンダリングしたページにてmailtoを使用した場合
・ページ文字エンコードShift_JIS、URLエスケープ無し
 →○
・ページ文字エンコードShift_JIS、URLエスケープ有り
 →○

Flashにてmailtoを使用した場合
・URLエスケープ無し(外部からShift_JIS文字列をセット)
 →×
・URLエスケープ無し(外部からUTF-8文字列をセット)
 →×
・URLエスケープ無し(Flash内部文字コード
 →×
・URLエスケープ有り(元の文字コードShift_JIS
 →×
・URLエスケープ有り(元の文字コードUTF-8
 →×

============================================
[SO-903i]
■HTMLレンダリングしたページにてmailtoを使用した場合
・ページ文字エンコードShift_JIS、URLエスケープ無し
 →○
・ページ文字エンコードShift_JIS、URLエスケープ有り
 →○

Flashにてmailtoを使用した場合
・URLエスケープ無し(外部からShift_JIS文字列をセット)
 →○
・URLエスケープ無し(外部からUTF-8文字列をセット)
 →×
・URLエスケープ無し(Flash内部文字コード
 →○
・URLエスケープ有り(元の文字コードShift_JIS
 →○
・URLエスケープ有り(元の文字コードUTF-8
 →×
============================================

HTMLベースでのテストでは、
mailtoリンクを踏んだ際に機種側での特殊な処理は行われているようには見受けられず、
両機種ともhtmlヘッダで指定された文字エンコードがそのまま適用された。
つまり文字化けはしなかった。


FlashLite1.1でのテストでは、
Shift_JISUTF-8エンコードどちらの文字列を使用してもページ内では両機種ともにまったく同じ文字列が表示されたが、
mailtoリンクにその文字列を渡した場合には、SO-903iはページ内と同じ文字列が表示されて、
N-04Bは謎の文字エンコーディング変換が行われ、違う文字列が表示された。


FlashにはSystem.useCodepageというフラグがある。
これは外部から読み込むテキストなどの基本文字エンコーディングUTF-8にするか、呼び出しシステムに依存したエンコーディングを使用するかというフラグ。
(FlashLite側では明示的に使用文字エンコードの指定はできない)


※これよく勘違いして覚えてるらしき人が多い上に、ネット上でも誤った情報を散見しますが(端的にわかりやすく説明しているだけかも知れませんが)、
Adobeのリファレンスを信用するなら、
http://help.adobe.com/ja_JP/FlashLite/2.0_FlashLiteAPIReference2/WS5b3ccc516d4fbf351e63e3d118cd9b5f6e-77c7.html
http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/system/System.html

System.useCodepage = true;

つまり、これを一行目に書いても、イコール「明示的にShift_JISを選択する」ことにはならないハズです。



デフォルトではfalseになっており、つまり通常はFlash側でデフォルトと指定されているUTF-8が選択されるはずが、N-04Bでは文字化けを起こした。
これをtrueにして呼び出しシステム側のエンコーディングを使用しようとした場合、
N-04B独自の文字エンコーディングが選択されているはずが、これも文字化けを起こした。


文字化けした結果パターンから想定されるのが恐らくUTF-8Shift_JIS変換なのだが、
UTF-8文字列を渡した場合でもエスケープしたしないに関わらず期待した結果が返ってこなかった。


上記結果からの推論だが、
N-04BでFlashLite1.1を動作させた時の基本挙動として、
getURL()関数に"mailto:"を使用する際、URLエスケープしているしていないに関わらず、なんらかの文字エンコーディング変換が行われている
と考えられる。


N-02Aは中国語(簡体字繁体字)に対応しているという情報があるため、
N-02A以降の同シリーズ及び類似機種では標準規格のUTF-8Shift_JISコードではなく、独自仕様の文字エンコードを使用している可能性がある。
そしてFlashLiteからメーラを起動した際には必ず文字エンコーディング変換処理をするため、文字コードテーブルが合わずに文字化けが起きるということだと思う。
間違ってたらごめんなさい>中の人

対応策としては今のところ、『mailtoを置く画面はHTML出力する』ことしか無いと思われる。
因みに下記羅列URLの二番目にあるソースコードも試してみたが、文字化けは解決しなかった。


余談だが、

subject = "";
body = "";
getURL("mailto:aaa@example.com","","GET");

のように、getURLと同階層のsubejct,body変数にタイトルと本文を入れても文字列自体は渡せるが、
N-04Bなどの(恐らくFlashLite3.x系を搭載している)携帯ではメール画面から戻った時にsubjectやbodyが含まれるURLに遷移するため、よろしくない。


Flash内部文字エンコードなどの参考資料を並べる。

swfmillでFlash Lite 1のswfを扱えるようにしてみた - DSAS開発者の部屋
http://dsas.blog.klab.org/archives/51174693.html

ケータイFlashのmailtoリンクを3キャリア対応にしてみよう - 携帯サイトをつくろう。 | 携帯サイト制作のために役立つ情報満載サイト
http://www.plusmb.jp/2009/10/01/4510.html

escapeMultiByte () - Flash CS5 ActionScript 3.0 言語リファレンス -
http://help.adobe.com/ja_JP/Flash/CS5/AS3LR/flash/utils/package.html#escapeMultiByte()

Macromedia Flash Player 6 以降でのエンコーディングについて - Adobe TechNote
http://kb2.adobe.com/jp/cps/228/228624.html


もしどなたかこの問題について詳しい方がいたらコメントお願いします。