2008-08-01

IE6/7 が Aptana Jaxer のレスポンスを誤認して文字エンコーディングの検出に失敗することがある?

Aptana Jaxer で、ある特定の条件で HTML ページをレンダリングすると、Internet Explorer で、誤った文字セットを使用して HTML ページがレンダリングされる という振る舞いが引き金となって、IE6 と IE7 で文字エンコーディングの検出を誤認することがあります。

HTML ページのなるべく先頭に、次のような meta 要素を指定しているにも関わらず、IE6 と IE7 は文字エンコーディングを UTF-8 でなく Shift_JIS として認識してしまいます。

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

この文字エンコーディングの誤認は、Aptana Jaxer が HTML ページをレンダリングするときに自動的に挿入する、次のような script 要素の文字列長と関係しています(と推測しています)。

<html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml" lang="ja"><head>
<script src="/jaxer/framework/clientFramework_compressed.js?version=0.9.7.2472"></script>
<script>Jaxer.Callback.pageSignature = ...</script>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">

Aptana Jaxer は、html 要素のすぐ後に Jaxer Client Framework の JavaScript ファイルと、サーバとクライアント間の引き渡すデータを JavaScript コードを追加します。この追加する JavaScript の文字列長は、クライアントからサーバにコールバックするかどうか、サーバからクライアントにデータを引き渡す かどうかの条件によって変わってきます。

Aptana Jaxer が追加する script 要素の位置を変更する方法は見つかっていないため、次のとおり、HTTP ヘッダを使って文字エンコーディングが UTF-8 であることを明示すれば、この問題は解決できます。

Aptana Jaxer の中で HTTP ヘッダを上書きできます。次のとおり、Jaxer.Response.addHeader メソッドを使って、Content-Type ヘッダを上書き(引数 true)します。このとき charset=utf-8 を明示します。

Jaxer.response.addHeader('Content-Type', 'text/html; charset=utf-8', true);
もしくは Apache 2.2 の MIME タイプの設定を、次のように変更します。このとき charset=utf-8 を明示します。

AddType "text/html; charset=utf-8" html
なお、このエントリで扱った Aptana Jaxer のバージョンは 0.9.7.2472 のものです。ですので、先日公開された 1.0.0 RC B では改善されているかもしれません(未確認です)。

9 件のコメント:

nakajiman さんのコメント...

Microsoft サイトでは HTTP レスポンスが "チャンク" のとき再現しますとあります。Aptana Jaxer は Content-Length を返すので、別な原因かもしれません。が、今のところ、これ以外に原因が見当たりません。

aquilegia さんのコメント...

勉強になります。
これはクライアントフレームワークのスクリプトがmeta要素よりも前に挿入されることで、meta要素が4KB以降に出現しまい問題が発生すると勝手に解釈してみました。

私も週末に確認してみます!

aquilegia さんのコメント...

>次のような script 要素の文字列長と関係しています(と推測しています)。
nakajimanさんの推測は正しかったです。調べたところやはり4kを境に文字化けすることを確認しました。

nakajiman さんのコメント...

>nakajimanさんの推測は正しかったです。調べたところやはり4kを境に文字化けすることを確認しました。

連絡ありがとうございます。試した Jaxer のバージョンですが 1.0 RC B の最新版でしょうか?

もし最新版なら Aptana に不都合があるよぉと報告してみます。

aquilegia さんのコメント...

0.9.8と1.0RC Bの両方で確認しました。

nakajiman さんのコメント...

次のとおり、Aptana に報告しておきました。どうなることやら。

IE6 uses the wrong character set when it renders the "Jaxer.Callback" and an large "Jaxer.clientData".

aquilegia さんのコメント...

お疲れ様です。英語駄目な私から見るととても凄いことに見えます。正式版リリースまでに修正してくれることを期待!

nakajiman さんのコメント...

もう少し詳しく教えてくださいというコメントがあったので、サンプルと再現手順を伝えてみました。

nakajiman さんのコメント...

どうやら受け入れてくれたみたいです。Jaxer 1.0.0.3970 RC C 以降で反映されるみたい。