「アップル公式サイト・トップページの画像が表示されない」件について (解決?)

フォーラムのポストを追っていたのだけど、原因はどうも Apple のせいではなくて Opera のせいな気がする。

具体的には、

//“\”\‘\
var a=/”/;

こういう JavaScript ファイルを作って、UTF-8で保存する。(うちでは改行コード LF にした)

それとは別に HTML ファイルを作って、中身にこれだけ

<script src="保存したスクリプトへのパス"></script>

書いて、Opera で開く。

そうすると、このようなエラーが出ることが、うちの Mac OS X, Opera 9.63 で確認できる。

Inline script compilation
Syntax error while loading: line 2 of linked script at file://localhost/ほにゃらら.js :
Expected expression
^

これが「アップル公式サイト・トップページの画像が表示されない」問題の原因であることはほぼ間違いない。(OSが日本語と英語環境で違うとかそういうことがあるらしいのだが、そこまでは調べていない)


肝心の JavaScript だが、2行のうち最初の行はただのコメント。2行目は単純な正規表現なのだが、中身は普通のダブルクオート (数値参照の & #00034;) ではなく、傾きのあるダブルクオート (& #08221;) である。

参考

正規表現リテラルではなく

//“\”\‘\
var a="”";

と文字リテラルでも同じエラーが起こる。(真ん中のダブルクオートのみ & #08221; )

1行目のコメントが無い場合、まはたコメント内の文字を削った場合はエラーは出ない。コメント部分も普通の文字ではなくて、

&#08220;&#00047;&#08221;&#00047;&#08216;&#00047;

という順番。

ちなみに、外部スクリプトではなくインラインスクリプトの場合はエラーは出ない。

教訓

何でもサイトのせいにするのはOperaユーザーの悪いところ。

わかったかも

あ、これかも。

<script type="text/javascript" charset="utf-8" src="保存したスクリプトへのパス"></script>

ascii 以外の文字がある場合は charset を指定しないとパースできないことがある。条件が謎だけど。

Opera が律儀すぎるのかな。。

でも、curl で試したところ、

curl -A "Opera9.63 (Macintosh; Intel Mac OS X; U; en) Presto/2.1.1" http://www.apple.com/jp/

の場合も

curl -A "Opera9.63 (Macintosh; Intel Mac OS X; U; ja) Presto/2.1.1" http://www.apple.com/jp/

の場合もちゃんと charset="utf-8" が入ってるんだけどなあ。

原因はOperaの仕様らしい

現行の Opera はセキュリティ上の理由から、別ドメイン(この問題の場合は images.apple.com)に置かれたファイルのエンコードについては、charset 指定によってではなくサーバからの情報を優先する仕様となっています。js file には(この場合だけでなく、通常)エンコード情報が付与されておりませんので、Fallback encode でファイルをデコードしてしまうのが本件の原因かと思われます。また各自動選択時に挙動が変る原因は、それぞれ選択候補の範囲が異なるためです。以上のように原因が判明したため、もし行うならどの仕様変更が最も安全かつ有益かを検討しているところです。このスレにて情報をお寄せいただいたユーザの方々に御礼申し上げます。

アップル公式サイト・トップページの画像が表示されない - Web ページの閲覧に関する問題解決 - 日本語

というわけで、外部ドメイン (この場合は www.apple.co.jp から images.apple.com) のスクリプトを呼び出すときは、script 要素の charset 属性が無視されるという Opera の仕様らしい。

Ascii 以外の文字 (Latin-2 相当) が含まれるのに application/javascript (application/javascript; charset="utf-8" とかではなくて) でファイルを提供している Apple にも非があるとは言えなくもないが、そこはちゃんと HTML のほうで charset="utf-8" を指定しているのだから、このページに限って言えば表示できないのは Opera のせいじゃないかな (私見ですけど)。

いずれにせよ、Opera の仕様変更で対応されるというのだから対応を待つか、現時点で困っている人は、Apple のサイトでエンコードを自動選択から UTF-8 に変えればいいらしい。*1

*1:僕のところではこの不具合が発生しないため、この方法は試してない。うちで何故かちゃんとページが表示されていたのは、僕の OS の言語が英語のため、Opera の標準 (Fallback 先) のエンコードが Latin2 を含んでいたためだったらしい。では日本語 OS 環境では Fallback 先エンコードは何なんでしょう?