Shift_JISを使うように設定している状態で、Macで動作させているときのみ通信時に処理する文字コードが化けることがあり、調べて見たところShift_JISの仕様の差違が原因で発生していた問題でした。
ちょっと原因と対応が複雑だったので、まとめてメモしておきます。
バグの症状について
発生する問題は「WindowsとMacで通信するときに送られる文字が違い、特定の環境で特定の文字のみが化ける」というものです。
私の遭遇したケースは、以下のような状態でした。
つまり、「MacのFlashから送信するときにのみ何かおかしくなっている」という状況でした。
バグの原因
現在のFlashは内部は UTF-8を使用しているので、なんとなくShift_JISに変換しているところに問題がありそう、と予想は出来ました。参考:http://kb2.adobe.com/jp/cps/228/228624.html
結局、原因は、Shift_JISには亜種が多数存在していること、でした。
おそらく、FlashPlayerはUTF-8からShift_JISに変換するのに、OS依存のライブラリを使っているのだろう。それがWindowsと Mac OS Xで違う挙動をしているため、送信されたデータの文字コードが変わってしまうのだ。Flash Playerがその変換ライブラリを固定で内部に持っていてくれたらいいのだけど、それではAIRとかで問題が発生することになるかもしれない。 Shift_JISを使ってマルチプラットフォームとかやるもんじゃないね、と再確認されました。
バグへの対応
原因は分かって、いざ対応!というところですが、原因が原因なのでOSを判定し、送信前に文字コードを変換するしかありません。
どの文字コードをどのように変換すべきか、というのは下記のページにわかりやすくまとめられていました。

ちょっと文字コードを出力しつつ調べて見たら、Macの場合にはCP943に自前で変換すれば良さそう、というところまで分かりました。
で、今回私の遭遇した問題に対しての対応では、下記のようなコードで変換し、問題を回避しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var strInput:String; // 送信したい文字列. var lenStr:int = strInput.length; var strPost:String = ""; // POST用に変換した文字列. for ( var i:int = 0; i < lenStr; i++ ) { var curCode:int = strInput.charCodeAt( i ); if( isMac ){ // Mac OS Xの場合のみ、以下の変換処理. switch (curCode) { case 0x2015: curCode = 0x2014; break; // 0x815C:EM DASH EMダッシュ. case 0xFF5E: curCode = 0x301C; break; // 0x8160:WAVE DASH 波ダッシュ. case 0xFF0D: curCode = 0x2212; break; // 0x817C:MINUS SIGN 全角ハイフン. } } strPost += String.fromCharCode(curCode); } |
上記コードで変換している文字コードをまとめたテーブルも添付しておきます。
その他の可能性
ちなみに、FlashでShift_JISを使用していると発生する問題は他にもあります。
以前書いたエントリへリンクを張っておきます。
[AD]
↓WEB+DB PRESS plusシリーズで文字コード本が出てるのか!波ダッシュ問題も載ってるようだし、これは良さそう!
プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)
著者/訳者:矢野 啓介
出版社:技術評論社( 2010-02-18 )
定価:¥ 2,709
Amazon価格:¥ 2,709
単行本(ソフトカバー) ( 400 ページ )
ISBN-10 : 477414164X
ISBN-13 : 9784774141640
↓文字コードに関する本では、こちらも評価が良いみたい。
著者/訳者:深沢 千尋
出版社:ラトルズ( 2003-07 )
定価:¥ 3,129
Amazon価格:¥ 3,129
単行本 ( 614 ページ )
ISBN-10 : 4899770510
ISBN-13 : 9784899770510
↓上記のような問題を抱えているときに心が和む。か、もっと苛立つかw、そんなおもちゃ発見!







