URLからFlashの変数にデータを送る
Flashにアクセスする際のファイル名の後に文字列を加える事で、表示するFlashの変数に値を代入する事ができます。
テキストボックスに何か文字を入力し送信ボタンを押すと、Flashが表示され入力した内容が表示されます。
Flashが表示されているときにアドレスバーのURLを見ると、最後のほうにテキストボックスに入力した文字列があるのがわかります。
URLからFlashの変数にデータを代入するには、Flashにアクセスする際のURLの最後に以下のように変数名と値を記述します(CGIなどにデータを送る要領と同じです)。
http://www.example.jp/flash/test.swf?suuzi=4
この場合は「test.swf」を表示し、変数「suuzi」に「4」を代入しています。
Flash内でこの変数へアクセスをするには、「_root.suuzi」のようにします。
ただし、ActionScript で変数に他の値を代入してしまうと、せっかく代入した値が上書きされてしまうので気を付けてください。
複数の変数に代入する場合は「&」で各変数を区切ります。
http://www.example.jp/flash/test.swf?suuzi=4&moji=ABC&test=123abc
この方法での変数代入はインターネット上にある swf ファイルにアクセスする場合のみ可能で、ローカルに保存してある swf ファイルでは行う事ができない場合があります。
Flashを表示するブラウザやプレイヤーなどによっても可能かどうかは変わります。
半角英数の文字だけであれば、上記の方法でも正常に指定した変数に代入する事ができますが、
ひらがななどの全角文字を送信する場合、ページ(htmlファイル)の文字コードによっては文字化けを起こしてしまうことがあります。
文字化けとは送信した文字が意味不明の記号などに置き換えられてしまって正常に表示できなくなる現象のことで、
送信側や受信側がデータを正しく処理しなかった場合に起こる可能性があります。
http://www.example.jp/flash/test.swf?suuzi=4
文字化けを防ぐために、上記の赤太字の部分の認識に少し細工を加える必要があります。
まずはじめに、URLの文字にはひらがななどの全角文字を使うことはできません。
これを無視して無理やり使おうとすると文字化けなどの原因になることがあります。
http://www.example.jp/flash/test.swf?moji=あいう
つまり、上記のような書き方はすることができません。
そこで、URLエンコードというものを利用します。
全角文字を決められた規則に従って半角英数記号に置き換えることで、文字化けなどの影響が起こらないようにしています。
普段インターネットを使っているだけでは意識することはありませんが、ウェブページではURLに含まれる全角文字をURLエンコードして情報を受け渡しています。
エンコードする文字の例 | ⇒ | エンコード後の文字列(UTF-8変換) |
テスト | %e3%83%86%e3%82%b9%e3%83%88 | |
あいうえお | %e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a |
URLエンコードをすると、全角文字は半角英数記号に変換され、
URLデコードをすると元の文字列に戻せるようになっています。
直接全角文字をURLに使わずに、URLエンコードして以下のようにします。
http://www.example.jp/flash/test.swf?moji=%e3%83%86%e3%82%b9%e3%83%88
URLエンコードをした状態の全角文字をFlashに送信し、Flashでそれを受け取りデコードして表示すれば、安全に全角文字を受け渡す事ができます。
FlashでのURLエンコード、URLデコード処理は ActionScript で簡単に行う事ができます。
escape() | 指定した文字列をURLエンコードする |
unescape() | 指定したURLエンコード文字列をURLデコードする |
全角文字をエンコードしたい場合には、以下のようにします。
msg_e = escape("エンコードしたい文字列");
これで、変数「msg_e」にはURLエンコードされた文字列が代入されます。
続いて、URLエンコードされた文字列をデコードしたい場合は以下のようにします。
msg_d = unescape("%e3%83%86%e3%82%b9%e3%83%88");
変数「msg_d」に、URLデコードされた全角文字列が代入されます。
URLエンコード、URLデコードを簡単に行えるサイトもあるので、参考にしてみてください。
⇒Web便利ツール / URLエンコード・デコードフォーム
URLエンコードに使用する文字コードにはUTF-8を使用してください。
●タグの属性で変数値を指定する
Flashの変数にデータを送る方法は、URLに記述するという方法だけではありません。
html にFlashを埋め込む際に使用するOBJECTタグやEMBEDタグに"FlashVars"という属性を付加し、
その属性の値に変数とデータを記述することでもFlash内の変数にデータを送ることができます。
送るデータの書き方はURLに記述するときと同じ書き方です。
OBJECT タグの場合( PARAM タグのみ挙げます):
<param name="FlashVars" value="suuzi=4&test=ABC" />
EMBED タグの場合:
<embed FlashVars="suuzi=4&test=ABC" src="sample.swf" quality="high" width="320" height="320" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
●異なる文字コード間でデータをやり取りする
Flash内の変数にデータを送る際、URLエンコードに使用する文字コードはUnicode(UTF-8など)でなければいけません。
しかし、どうしてもShift-JISを使用しなければならない場合(文字コードが Shift-JIS で記述された html から form タグでFlashにデータを送る場合など)には、
デコードの解析部分を工夫することで文字化けを防ぐことができます。
まず、URLから変数「qr」のデータを受け取り、そのURLエンコードされた文字列をURLデコードして、
変数「tx」に代入する処理を考えます。通常であれば以下のようにするだけで済みます。
tx = unescape(qr);
変数 qr のデータが Unicode でエンコードされたものであれば問題はないのですが、Shift-JISでエンコードされた文字列の場合上記のように読み取ると文字化けを起こしてしまいます。
そこでその部分に以下のように細工を加えてみます。
System.useCodepage = true;
qr = unescape(_url.split("?qr=")[1]);
tx = "Flashに送ったデータは[ " + qr + " ]です。";
System.useCodepageについては、「System.useCodepage について」を読んでください。
「unescape」の引数が複雑なので、どうなっているかを説明します。
「_url」という変数はFlashのシステム変数で、もともと以下のように swf ファイル自身が存在しているパス(URL)が含まれています。
http://www.example.jp/flash/sample.swf?qr=123
含まれているパスには、Flashに送ろうとしていた変数の値の情報も含まれるので、これを利用します。
このURLをsplitメソッドを使ってふたつに分けてみます。
split() | 指定した文字列を境に、変数の文字列を分割して配列にする |
文字列を分けるのに指定する語句は「?qr=」のようにしてみます。
すると、上記のURLの例では、以下のように分割することができます。
http://www.example.jp/flash/sample.swf?qr=123 | |
↓ | ↓ |
配列[0] | 配列[1] |
http://www.example.jp/flash/sample.swf | 123 |
欲しいデータはFlashに送ろうとしていた情報なので、配列[1]のデータになります。
そしてその値が「unescape」の引数になっているので、デコードされて変数「qr」に代入されます。
あとはそのデータをFlashで表示するだけです。
コロいぬさんと his さんにお世話になりました。ありがとうございます。