JavaScriptのみで任意の文字コードのURIエンコードを試みる
JavaScriptのみで任意の文字コードのURIエンコードを試みました。ecl.jsというものが既にあり、それを使用すれば問題ありませんが、別のアプローチで変換しようとしました。
結果として、IE(dataスキーム未対応ブラウザ)でdecodeできませんでした。以下のリンクがテストページです。
理屈
submitするとクエリの値がそのページの文字コードでencodeされるのでsubmit後のアドレスから取ればいけそう魂胆
- iframeを生成
- document.writeでiframe内にformを生成
- input type="hidden"のvalueにエンコしたい文字をセット
- iframe内のロードが完了したらmethod="get"でsubmit
- iframe内のページが遷移したらlocation.hashをいただく
試行錯誤
form actionにabout:blankを指定しましたがうまくいきませんでした。data:text/html,と指定したらFirefoxで成功しましたが、ほかのブラウザでうまくいきませんでした。仕方ないので同じドメイン内にcall.htmlというHTMLを置いて、そこに飛ぶようにしました。call.htmlはwindow.parentにアクセスして、location.hashの値を渡します。非同期的にならざるを得ないので、encode関数は戻り値ではなくcallbackという形になりました。UTF-16がなぜかうまくいかなかったのでcharCodeAtの値を使いました。
decodeはdataスキームを使う以外に思いつきませんでした。IEはdataスキームに対応してないのでうまくいきません。取り方はiframe srcに"data:text/plain;charset=文字コード名,エンコードされた値"を指定して、内部にアクセスするというやり方です。XHRでとろうとしたら失敗しました。