Posted by yamada on 2010/05/20 – 09:00
Shift_JISを使うように設定している状態で、Macで動作させているときのみ通信時に処理する文字コードが化けることがあり、調べて見たところShift_JISの仕様の差違が原因で発生していた問題でした。
ちょっと原因と対応が複雑だったので、まとめてメモしておきます。
バグの症状について
発生する問題は「WindowsとMacで通信するときに送られる文字が違い、特定の環境で特定の文字のみが化ける」というものです。
私の遭遇したケースは、以下のような状態でした。
- Mac OS Xで、FlashからPostメソッドで送信したデータに含まれる特定の文字が化ける
- 特定の文字は「ー(全角ダッシュ)」「~(波ダッシュ)」
- Flash上の表示、traceで確認する内部データは問題なし
- Windowsでは問題なし
- System.useCodePage = true; とし、Flashで通信はShift_JISを使用
つまり、「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シリーズで文字コード本が出てるのか!波ダッシュ問題も載ってるようだし、これは良さそう!
↓文字コードに関する本では、こちらも評価が良いみたい。

文字コード超研究
著者/訳者:深沢 千尋
出版社:ラトルズ( 2003-07 )
定価:¥ 3,129
Amazon価格:¥ 3,129
単行本 ( 614 ページ )
ISBN-10 : 4899770510
ISBN-13 : 9784899770510
↓上記のような問題を抱えているときに心が和む。か、もっと苛立つかw、そんなおもちゃ発見!
Posted by yamada on 2010/03/02 – 09:00
鬼門のwmode
“wmode”、Flashを使った仕事をしている方なら一度は悩まされた経験があるのではないでしょうか。
Flashの出力ファイルであるswfをhtmlにエンベッドするときに指定するパラメータの一つです。
Firefox 3.6
ところで最近、Firefox 3.6にアップデートされて、 Flash上でマウスホイールによるウィンドウスクロールができなくなってしまいました。
とある案件でこの問題が浮上してきて困りましたが、知り合いが調査してくれた結果、回避方法が分かりました。
しかしその回避方法とは「wmodeの設定で”window”以外にする」というもの。
うわー!
出た!
wmode!!
ただ、今までは「wmodeを”window”以外にすると日本語入力が出来ない」という致命的なFXXKINGバグがありましたが、その時はwmodeを他のもの(“opaque” か”transparent”)に変えて対応してきました。
ところが、今回はその逆です。
つまり、日本語入力が必要かつ、Firefox3.6でフルスクリーンFlashでFlash上でマウスホイールによるスクロール欲しい、となったらアウトです!
幸い、今回の案件では日本語入力が必要ないものだったのでwmode変更で対応出来ました。
あと、Scroll on FlashというFirefoxアドオンによる回避方法もあるようですが、Windowsでしか使えない上に、サイト閲覧者にこれをインストールしろ、とは言えないですよね。
Flash Player 10.1! 早く!
ところで、Flash Player 10.1のベータ版が配布されています。
kamijoさんもblogに書かれていますが、新機能はよく分からない。
そこで、期待しないでリリースノート(PDF)を見てたら、Fixed Issuesの中に驚きの一文を発見しました!
Can’t input Japanese characters in text field if wmode “opaque” or “transparent” is set true except IE.
おぉ!!!
これは!!Flash Player 10.1では、wmodeの指定と日本語入力の問題が直る!ということです!(よね?)
ってか、やっぱり(ブラウザの問題ではなくて)Flash Playerのバグだったのか!一体どれくらいの人がこのバグに悩まされていたり、仕様変更を余儀なくされていたのか!と大崎に向かって言いたいところですよ。
一般公開はまだなのですが、バグ修正分だけはさっさとリリースして欲しいです!
こういうバグを何年も放置しているものはやっぱりiPxxには載せられないよね。
クパチーノで「この致命的なバグリストを直すまでは載せられない」とでも言われたのかな?というぐらい、 Flash Player 10.1では結構真剣にデバッグされているような気がする。
あと、IDE側もいろいろと直したり、基本機能の改善を行って欲しいです。iPhoneアプリ書き出せるとか、追加機能はその後だよ!
[AD]
↓MySQLを使おうとしているのですが、最初にどこまで考えて作ったらいいのか分からない。この本とか参考になるのかな?

MySQLによるタフなサイトの作り方
著者/訳者:佐藤 真人 桑野 章弘 岡田 達典 大黒 圭祐
出版社:ソフトバンククリエイティブ( 2009-09-17 )
定価:¥ 3,360
Amazon価格:¥ 3,360
大型本 ( 408 ページ )
ISBN-10 : 4797353937
ISBN-13 : 9784797353938
↓PixelmatorはMac OS Xで使えるPhotoshop的画像エディタ。現在絶賛試用中!PSDファイル開けるし、ショートカットもかなり同じだし、Elementsよりこっちがいいかもしれない。

ピクセルメーター
定価:¥ 8,980
カテゴリ:CD-ROM
発売日:2009-07-30
Posted by yamada on 2009/12/16 – 16:13
Filed under トラブルシューティング
Tagged as apache, PHP, web
localhostで使っているapacheの設定がどこかおかしいらしくて、HTMLでUTF-8に設定しても強制的にShift-JISになる現象が発生していて困っていた。
Firefox + Live HTTP headersで調べてみても、Shift-JISが帰ってきていることは確かなのです。
しばらく放って置いたのですが、今日、ちょっと時間が空いたのと、解決しないとダメな状況になったので追求してみました。
まずはhttpd.conf
設定はhttpd.confにあり、ということで、ここを調査。
でも、AddDefaultCharsetは設定していない。
ちがうのかー。
次は.htaccess
ということで、どこかローカルで設定してしまっているのかな?と.htaccessを調べた。
でも同じディレクトリには.htaccessは無い。
途中のディレクトリに隠れているかも?ということで、ルートディレクトリに置いてみた。
しかし、変わらず!
いっそのこと、逆に、.htaccessを置いて、そこでUTF-8にしてしまおうか?と泥沼な対応となるのは分かっているのですが、トライしてみた。
テストしているhtmlのあるディレクトリに、AddDefaultCharset UTF-8 と書いた.htaccessを置いて、apacheを再起動してみた。
しかし!これでもダメ!何?!何なのいったい!
と発狂寸前になるが、冷静に考えると、こういう設定を書き換えたモノをもう一つ思い出した。
php.iniがいたね
それが、PHPの初期設定ファイルであるphp.ini。
あー、ありました。怪しいところが。
PHPの勉強にと、ある本を見ながら盲目的に設定していたところが超怪しい。
mbstring.internal_encoding = SJIS
mbstring.http_output = SJIS
上記の2行をコメントアウトして、apache再起動!
これで直りました。とさ。
[AD]
↓がっかり度はこのくらい orz
↓先生、がっかり orz
Posted by yamada on 2009/06/05 – 22:45
Filed under AS3, Flash, トラブルシューティング
Tagged as AS3, Flash
とある大きなプロジェクトで作っているflaファイルをパブリッシュしていたら、今まで見たことのないエラーが出てきました。
「5005: バイトコードの最適化中に不明なエラーが発生しました。」(英語版では次のように表記されるらしいです→“5005: Unknown error optimizing byte code”)
ちなみに、私の環境はWindowsXP SP3, Adobe Flash CS3 Professionalですが、MacOSXやCS4でも発生するようです。以下に私の場合の対策手順とか書きますが、環境によっては若干違っていたり、対策が効かなかったりすると思いますので、その場合には参考にして、いくつかの対策をとってみると直る可能性があります。
以降、このエラーを「5005エラー」と呼ぶことにします。
5005エラー
5005エラーについて一番いろいろな情報が集まっているのは、次のブログエントリ(英語)です。
日本語情報では、Saqooshaさんが次のブログエントリにまとめておられます。
日本語の方で分かりやすいような気もしますが、negushさんのブログに書かれている情報(元記事とコメント)は、根本的な問題から、実に様々な対策に触れていて興味深いので、こちらの情報を元に考えたことをまとめておきたいと思います。
最初の対策:最適化をOFFにする
5005エラーが出るのは、「最適化」中に発生する問題なので、その設定をOFFにすればよい、という話が出ています。
これを行うには、「パブリッシュ設定」の中の「ActionScriptの設定」をクリックして出てくるダイアログの中の「オプティマイザ □ ファイルサイズを縮小し、パフォーマンスを向上」というチェックボックスに入っているチェックを外します。

しかし、もちろん、このチェックを外すとファイルサイズは縮小されず、パフォーマンスに問題が出るかもしれません。
私の環境ではちょっとこの対策は行えない、と判断し、確認しませんでした。
というわけで、ほとんど実用的な解決策ではありませんが、もし対策可能なケースがあれば、これが最も簡単な対策となります。
次の対策:ASOファイルを削除する
ASOファイルという中間出力ファイルが壊れてしまって、パブリッシュ時に5005エラーが出ているケースもあるらしいです。
そのケースへの対応は、ASOファイルを一旦削除する、ということになります。これは、「制御」メニューから「ASOファイルを削除」という項目を選びます。

私のケースでは解決できませんでしたが、簡単なのでとりあえず試してみる価値はありますね。
メインの対策:その1
最後にして、メインとなる解決方法が、この方法。
ただしこの方法、FlashやPCの再起動を繰り返すことになるので、やる前にいろいろな作業を終えてから腰を据えてやった方がよいでしょう。
やる方法は、環境変数を変更する、というもの。
“JAVA_TOOL_OPTIONS”という環境変数を、“-Xmx1024M”にします。
Windowsの場合、「マイコンピュータ」を右クリック、「詳細設定」タブの下部にある「環境変数」ボタンを押すと「環境変数」というウィンドウ内が開きます。その下部にある「システム環境変数」というところで設定します。
現在設定されている内容がない場合、「新規」ボタンを押して、「変数名」に JAVA_TOOL_OPTIONS 、「変数値」に -Xmx1024M を入力し「OK」を押します。
これでWindowsを再起動して、Flashを開き、問題の発生したflaファイルでパブリッシュしてみます。
これでうまくいくことが多いらしいです。
メインの対策:その2
しかし!!!!私の場合パブリッシュ時にエラーが出るようになってしまいました。
次のようなダイアログが出ます→「JRE (Java Runtime Environment) の初期化時にエラーが発生しました。Flash を再インストールする必要があります。」

なんだこれー!!!!
と頭に血を上らせる前に、ひとつ深呼吸して、ここまでの設定した項目やエラーダイアログの内容を考えてみましょう。
すると、「Flashは、出力されたswfファイルを最適化するのにJAVAライブラリを使っている」という推測が出来ます。で、パブリッシュ対象のActionScriptクラスが肥大化してしまうと、最適化の作業領域としてJAVAライブラリに割り当てられたメモリ量では足りなくなってしまって5005エラーが出てしまっていた、という状況であることも推測できます。
そこで噂の対策法ではそのJAVAライブラリに割り当てるメモリ量を多めに指定することで解決できているのでしょう。
しかし、私の場合こんどは初期化時のエラーが出てしまった。これは割り当てられたメモリ量がPCの空きメモリ量を超えてしまっている、と想像できます。
環境変数の変数値に割り当てた”-Xmx1024M”の後半はおそらく”1024MByte”。私のPCに乗っかっているメモリ量は2GBなのでこれではきついことが容易に想像できます。
となると、あとはその数値を下げていくだけです。
512MB、256MBと下げていき、エラーが出続けていたのですが、ようやく”-Xmx128M”という設定で解決しました。
中には”-Xmx32M”でうまくいったという人もいるようなので、根気強く試してみてください。
このエラーで分かったこと
Flashのswf最適化にはおそらくJavaライブラリを使っている、と書いたのですが、JavaだとOptimizerとかObfuscatorっていろいろあるようですから、そういうモノの一つを改変して使っていると想像できます。
また、パブリッシュ時に「JRE初期化エラー」が出るタイミング、そのタイミングから最適化処理に入るのだろう、ということも分かります。
このあたり、もう少し突っ込んで調べてみたらおもしろいかもしれませんね。
以上、いろいろ想像混じりで調べてみましたが、もし、5005エラーが出てこのエントリにたどりついた方がおられましたら、このエントリが5005エラー対策の一助となればうれしく思います。
[AD]
↓AS3で遊ぶならこの本!
↓AS3、もう一度基礎から勉強しませんか?