OpenLaszloと外部の連携4

今まではaとかcとかを送信していたわけですが、次は日本語を送信してみます。

http://www.asahi-net.or.jp/~ya5m-kwbr/hash4/useFlashVarsMulti.html

fo.addVariable("val", "あ");
<input type="button" onclick="document.getElementById('lzapp').SetVariable('val','い')">

文字がそのままソース内に埋め込まれているわけですが、これはこれでデータ送信できています。IE,FireFox,Opera,NetScapeで動いてます。

ただMacromedia

http://www.adobe.com/jp/support/flash/ts/documents/fl0284.html

のページを見てみると、どうやらというか、やはりURIっぽくエンコードしたほうがいいようです。ってことでescapeを使ってエンコードしてみました。

fo.addVariable("val", escape("あ"));
<input type="button" onclick="document.getElementById('lzapp').SetVariable('val',escape('い'))">

http://www.asahi-net.or.jp/~ya5m-kwbr/hash4/useFlashVarsEscapeMulti.html

と、まあ当然動かないわけです。そもそもescapeしてFlashに渡したデータがunescapeされてないので、lzxを書き直してunescapeしてみました。ソースは以下のようになりました。

<?xml version="1.0" encoding="UTF-8"?>
<canvas width="500" height="250" debug="true">
    <simplelayout spacing="10" axis="y" />
    <button>check val
        <handler name="onclick">
            Debug.write("check:"+unescape(val));
        </handler>
    </button>

    <attribute name="val" />
    <attribute name="preval" type="text" value="" />

    <handler name="onval">
        Debug.write("onvalイベント:"+unescape(val));
    </handler>

    <method name="onidle" event="onidle" reference="LzIdle">
        if(val!=preval)
        {
            Debug.write("onidleイベント:"+unescape(val));
            preval=val;
        }
    </method>
</canvas>

修正後のサンプルがこちらです。

http://www.asahi-net.or.jp/~ya5m-kwbr/hash4/useFlashVarsEscapeUnEscapeMulti.html

はい。こいつも動きません。動きそうな気配がぷんぷんしていましたが、全然ダメダメです。この原因はブラウザのescapeの実装とOpenLaszlo内のescapeの実装が全然かみ合っていないのが原因です。

OpenLaszloのescapeはUTF8ベースのエンコードをします。UTF8ベースで'あ'は'%E3%81%82'で表されます。にもかかわらずページの真ん中にある埋め込まれたタグを見ると分かりますが、例えばIEの場合

<param name="flashvars" value="val=%u3042" />

のように%u3042などとなっていて、Flashには文字と受け取ることのできない形式になってます。この場合は3042という数字として受け取られているようです。しかもescapeはブラウザの実装依存です。どのブラウザがどんなエンコードをするかは以下のページで見れます。

http://www.openspc2.org/JavaScript/escape/index.html

結局UTF8ベースでLaszloのescapeに互換したものを自作するのが一番正確なのですが、それはそれで大変な気がします。さてさて、困ったなということでちょっと手抜きさせてもらってencodeURIを使うことにしました。

一応参考までに言えばLaszloのescapeは0-9a-zA-Z以外の文字を全てエンコードします。なのでencodeURIとはエンコードの範囲が全然異なります。この点で若干問題が出る可能性があります。またencodeURIは古いjavascriptにはなかったので古いブラウザに対応する場合にも自作のほうがお勧めです。

http://www.asahi-net.or.jp/~ya5m-kwbr/hash4/useFlashVarsEncodeURIUnEscapeMulti.html

fo.addVariable("val", encodeURI("あ"));
<input type="button" onclick="document.getElementById('lzapp').SetVariable('val',encodeURI('い'))">

やっとまともになりました。4つのブラウザで動作が確認できました。