IEのJavaScriptの笑っちゃう挙動

IEEUC-JPで動くはずなのにShift_JISで狂った挙動を

おまえ、さっきまでEUC-JPのつもりだっただろ?なんでいまさらShift_JISのつもりになってるんだ。というIEのだめだめな例。ネタ。

以下を書いているうちにぶつかった事例です。

http://d.hatena.ne.jp/hoshikuzu/20071011#p1

※というわけで長谷川さんがどうしても信じてくれないので書くことにしました。

まずまともに動く例を

以下はJavaScriptの文法的に合法なので、当然、FirefoxでもOperaでもIEでもきちんと動き、99がalertされます。
Shift_JISなので気楽にWindows付属のメモ帳(notepad)で作っちゃう。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( 十 ) ;

</script>

//このへん省略

補足しておきますが、\u5341 は、Unicode で「十」です。charset=Shift_JIS なので、alert()するときに、「十」がvar で宣言済みなのでエラーにならないです。99がアラートされます。ま、オッケーですね。

次にIEで笑っちゃう例を

charsetを、notepad で EUC-JP に変えてみます。
alert( 十 )の部分は変えません。あ、十の両隣には十分な空白をかいておいてくださいね。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( 十 ) ;

</script>

//このへん省略

IEでは、99がalertされます。FirefoxOperaでは、当然ながらエラーになります。まともなブラウザならば、上で、99 が alert しちゃぁ駄目です。 

notepadでいいので、以下のように書き換えます。


このへん省略

<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Script-Type" content="text/javascript">

//このへん省略

<script>

var \u5341 = 99;
alert ( スス ) ;

</script>

//このへん省略

ええと、「スス」の部分はですね、[0xBDBD]なのです。これ、EUC-JPにおける「十」であります。ねんのために、FirefoxOperaでソース表示すれば納得できます、はい。というわけで FirefoxOperaは当然のごとく、99がalertします。そして・・・IEでは、あれ?99がalertします。

IEよ、お前は、「alert ( スス ) 」でも、「alert ( 十 ) 」でも気にしないんだね?どっちも受け入れるんだね?よーく考えてごらん? 2番目の例であんたが読んだのは、[0x8F5C]だろ?これ、Shift_JISでのみ、「十」なんだよ?EUC-JPでは、別もんだよ?宣言されていないのに当然のごとくalertしていいのかね?その「99」ってドコカラ盗んできましたか?いつからそんなワルイコになったの?あたしゃ悲しいよ・・・シクシクシク。

IEJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい

EUC-JPモードで処理中なのにときどき、Shift_JISで処理したがるワルーイ癖がIEにはあるんですよねぇ・・ということの傍証になるのではと思いました。ほかにも寺田さんのサイト(今はないけど)に書いてあった傍証がありますです、はい。
こんなんでAjaxとかXMLとかでデータの交換をしてて大丈夫なのかねぇ(いや、UTF-8でやろうよというこなのですかぁ、はい。でもね、「十」ごときを処理できなくていいのかねぇ、というオハナシなの。)

追記:JavaScriptの処理系の内部コードはご存知のとおりUnicodeですよと決まっています。なので、EUC-JPのもと、メモ帳で書いたalert(十)が動いちゃうのは、JavaScriptのエンジンが悪いのか、それともIEJavaScriptのエンジンに外部データをエンコードして引き渡す際になんらかの事故が起きているのか、どちらかふたつのわけです。たぶん後者です。外形的に「IEJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい」なのですが、JavaScriptエンジンの責任ではないと言えるかもしれません。正しくは「IEの変なHTMLのパースのおかげでJavaScriptエンジンは、どうやらEUC-JPをまともに取り扱えないらしい」なのですね。最初からこれを言いたかったのですが、見出しの書き方に不備がありました。すでにブックマークされちゃっているのであえて見出しの変更は行いません。

ええと、検証は IE6 on WindowsXP with SP2 で行いました。

という小さなネタでした。以上、長谷川さんへ。