2007年06月20日
IEにおいて、HTTPヘッダがUTF-8以外でのページでは、Google API統一インタフェースが使えない
前提が多すぎてこのタイトルでいいのか微妙なんですけども。
まず以下、IEと書いているのはIE6SP2に、タブ表示の拡張したものです。
素のIE6やIE7でどうなるかはよう判りません。
また、Google API統一インタフェースと書いているのは、Ogawa::Memorandaさんのこちらの記事で紹介された、
GoogleのJavaScript API三兄弟である、Maps・Search・Feedのインタフェースがこっそり統一されつつあることに気がついたので、このエントリーで紹介します。
というものです。
上記記事を読んだ直後に、このブログでもFeed APIとMaps APIを両方使っていることもあって、上記の統一インタフェースに全面移行しました(例:このエントリ)。
で、私のメインブラウザであるところのFirefoxでだけ確かめて、動いた動いた、と思っていたのですが、昨日ちょっとMaps API触ってみようと思っていろいろ試していると、IEで動かないのを確認しました。
あれ?と思って、Ogawaさんが公開しているJavaScript API三兄弟のサンプルページを表示してみると、IEでもちゃんと動く。
でも、全く同じスクリプトを、私のサーバにおいてやると(APIキーはもちろん変えてます)、
1.サンプルページ1(統一I/F、HTTPヘッダ指定:EUC-JP、HTMLメタタグ指定:UTF-8)
IEではMaps APIのところで、エラーが出て動かない。
何でだろうと思って、エラーの内容や処理を追ってみると、どうも共通I/Fから実際にMaps用のスクリプトを呼び出しているところで、文字コードの解析エラーが起こってMapsのJavascriptコードが読み込まれてないっぽい。
でも、確かに元のブログ記事ではEUC-JP環境なのでなんか文字コードエラーが起こる余地はありそうなんだけど、このサンプルではOgawaさんのコードをそのままコピペしてるだけなので、一切の差はないはず。
途方にくれて、HTTPヘッダレベルとかでも比較してみると、Content-typeヘッダがうちではEUC-JP、OgawaさんところではUTF-8になってる。
HTMLレベルではHTTP-EQUIVのContent-typeでどちらもUTF-8にしてるので、差はないはずなんだけど、もう他に確かめられるところもないので藁にもすがる思いでエンコーディングをHTTPヘッダレベルで変えてみた。
すると...
2.サンプルページ2(統一I/F、HTTPヘッダ指定:UTF-8、HTMLメタタグ指定:UTF-8)
IEでも動いた!
で、言うまでもなく、共通I/Fを使わず、昔ながらのMaps API直接呼出しならば、HTTPヘッダ指定がEUC-JPでも、HTMLメタタグレベルでUTF-8を指定しておけばちゃんと動く。
3.サンプルページ3(Maps API、HTTPヘッダ指定:EUC-JP、HTMLメタタグ指定:UTF-8)
思うに、GoogleのAPIは常にUTF-8でJavascriptコードを返すはずなので、その返されたMaps APIのJavascriptコードを、IEがEUC-JPとしてパースしちゃっているっぽい。
サンプル1.、2.、3.の違いは、3.はMaps APIのJavascriptコードを直接HTMLから読み込んでいるのに対し、1.、2.は共通I/Fを通じてJavaScriptコード内からMaps APIのJavascriptコードを読み込んでいる。
かつ、2.で動いて1.で動かないという事は、IEには、Javascript内から呼び出したJavascriptコードを、呼び出し元HTMLのHTTPヘッダのエンコーディング(たとえそれがHTMLメタタグで打ち消されていても!)でパースしてしまうという、バグがあるのではないだろうか(追記:実際にはちょっと違ってた。詳細は文末追記参照)。
ちなみに、それではと思って、サンプル1でのJavascriptコードに全てエンコーディングを指定してやればどうだろうか、と思って試してみたが、
4.サンプルページ4(統一I/F、HTTPヘッダ指定:EUC-JP、HTMLメタタグ指定:UTF-8、scriptタグ指定:UTF-8)
これでもうまくいかないので、根は深いっぽい。
逆に、HTMLメタタグ指定ではEUC-JPにしておいて、HTTPヘッダ指定のみUTF-8としてやってやるとどうなるかというと、
5.サンプルページ5(統一I/F、HTTPヘッダ指定:UTF-8、HTMLメタタグ指定:EUC-JP)
これはうまくいく。
よって、どうしてもUTF-8以外でGoogle Maps APIを使いたい人は、統一I/Fを使わずこれまで通り直接Maps APIのJSを呼び出すか、或いはかっこ悪いですが、HTMLメタタグで利用するエンコードを指定し、HTTPヘッダでUTF-8を指定する、とかの方法をとる必要があるようです。
---- 追記 ----
ほとんど書いてしまってから気付いたので、打消し追記で処理します。
サンプルページ1のエンコーディングをIEのメニューから表示させてみて気付いたのですが、そもそもページ全体が、HTMLメタタグで指定したUTF-8ではなく、HTTPヘッダのEUC-JPでレンダリングされてしまっていました。
よって問題は、
-
IEがHTMLメタタグを無視して、HTTPヘッダのエンコーディングでレンダリングしてしまう(あまりそんなバグは聞いたことがないので...マルチバイト文字を含まない場合だけかな?)
-
JavaScript中から読み込んだJavaScriptに対して、IEがHTMLをレンダリングしたエンコーディングでパースしてしまう(というかエンコーディングを指定する術がない)
のダブルコンボで問題が発生しているみたいです。
よって、UTF-8以外で防ぐ方法は、当面は統一I/Fを使わないことしかないみたいですね...。
そもそもHTTPヘッダのcharsetの方が優先されるものだったような。
ヘッダにcharsetが出せない環境での次善の策がmetaだと思います。
http://www.w3.org/TR/html4/charset.html#spec-char-encoding
ああ、そうなのですか。
これはおハズカシス。
それじゃ、問題として残るのは2.だけなわけですね。
JavaScriptを読むときも、GoogleはHTTPヘッダでUTF-8を返してるのだろうから、それに従って読んでくれればいいのになあ。
> そもそもHTTPヘッダのcharsetの方が優先されるものだったような。
そうですね。
Firefox も Opera も Safari もそう動作しますね。
> GoogleはHTTPヘッダでUTF-8を返してるのだろうから、
UTF-8 を指定している場合と、無指定な場合があるようなんですが、IE のエラーメッセージって、どのスクリプトでエラーになっているのかよくわからない…
少なくとも、API のキーがなんとかっていう、日本語のメッセージが入っているスクリプトは、ヘッダで charset=UTF-8 になってますね。
おっしゃる通り、Shift_JISではfirefoxで表示するけれども、IEではエラーで表示されませんでした。UTF-8でサイトを作成します
Posted by: Yaskey at 2007年06月21日 23:59![[ここギコ!]](http://kokogiko.net/logo.png)



・SpaceTagがBlogホスティングセットの販売を始めた(shrine dbz hentai)
・昔のケータイ版ここギコの画像が出てきた(Anutkais)
・3D PaPaGO! 登場(Trimenfx)
・JR東日本ポケモンスタンプラリー2008コンプリート(見物人)
・フリーチベットデモ参加してきました(mityosi)
・もうAmazonクレジットカードは使いません...楽天カード一本で。(dk)
・KDDIのせいでWiki=Wikipediaが定着の恐れ(名無し)
・KDDIのせいでWiki=Wikipediaが定着の恐れ(tosiaki)
・2人の同僚が去っていった(宋)