[18] 資源ヘッダーは、ファイルの sniffing に使われる部分です。
[2] MIME Snffing では、 sniffing に使われるファイルの先頭部分を資源ヘッダーといいます >>1。
[4] MIME Sniffing Standard は、 先頭 1445 バイト以上が読み込まれるか、 末尾に到達するか、 利用者エージェント定義の十分な時間が経過するかのいずれか最初の時点での利用可能なデータ全体としています >>1。
[19] encoding sniffing には資源ヘッダーという用語はありませんが、 類似の規定が各仕様にあります。
[6] HTML の文字符号化宣言 (<meta charset>) は、
HTML文書の最初の 1024
バイト以内に含めなければならないと規定されています
>>5。
[12] XHR の文書応答における HTML の処理 (responseXML) では、
先頭 1024 バイトを使って prescan すると規定されています >>11。
[8] HTML の encoding sniffing algorithm の prescan では、 利用者エージェント依存としつつも、 先頭 1024 バイトまたは 500 ms 経過までのデータを使うことを勧めています >>7。
[23] ただしきっちり 1024 バイトに限定することが硬い要件とされているわけではなく、 必要があればそれを超える実装も仕様に違反しません。ローカルファイルの場合など、 すぐに利用できるデータがあって、それを読むことが精度と速度のバランス上有効と思われるなら、 利用できます。
[26]
また、 <meta charset> に関する prescan の処理には
1024 バイトの推奨がありますが、その後の頻度解析等の手法には長さの制限がなく、
現実的に 1024 バイトよりも多く読み込む必要がありそうです。
[27] Chrome はネットワークから最初に届いたデータに対して文字コードの判定を行います。 >>25
[35]
Firefox は最初の 1024 バイトが届いたら prescan や chardetng
による判定を行います。本構文解析で発見された <meta charset>
で異なる結果が得られれば符号化の変更を行います。
すべて読みこんだら改めて chardetng による判定を行い、
異なる結果が得られれば符号化の変更を行います。
>>24
[38] Firefox の挙動は Chrome の挙動だとネットワークの状況依存になってしまい結果が安定しないことへの批判です >>24 が、 体感的には Chrome が最初から正しい符号化でレンダリングの開始となることが多いのに対し、 Firefox は文字化け状態で読み込んだ後に再読み込みとなることが多く、 Chrome の挙動に分があるように感じられます。
<meta charset> の prescan で 1024 バイト以上読んでいるのか、
その他の要因によるのかは不明です。
[39]
HTML文書の先頭には本文の前に文書型宣言や head 要素などが書かれます。
<meta charset> がそこに書かれていればいいのですが、
それが無いときの文字コードの判定に必要な非ASCII文字はそれほど多くありません。
title 要素の中身が主となりますが、それすら
ASCII文字のみで構成されることも珍しくありません。
1024バイトは意外と短いのです。
[40] 古い HTML文書が多い Internet Archive に至っては HTML文書の先頭部分に Internet Archive のヘッダーのための要素群が挿入されています。 そのために本文は先頭から非常に遠い部分に追いやられてしまいます。
[41] 非ASCII文字があればいいというものではなく、 データが長ければ長いほど文字コードの判定の精度は高くできます。 1024バイト中の数バイトだけでは正しい判定が難しいことも多いです。
[42] それではデータをすべて使うのが常に正しいかというと、そうとも限りません。 例えば数ギガバイトの動画データが何らかの誤りで文字コードの判定処理に与えられたとき、 それをどこまで処理しても意味はありません。そこまで極端な例でなくとも、 確かに数百メガバイトの ASCII文字の後に非ASCII文字が来るという事例が考えられないわけではありませんが、 そのようなテキストファイルの文字コードの判定に失敗することが実装の責めに帰するとは考えにくく、 どちらかといえば無制限の長いデータの処理に伴う性能その他の悪化やセキュリティー問題のおそれを防ぐことの方が重要です。
[43] 推奨される実装戦略:
[10] MIME sniffing、HTML charset sniffing も参照。
[16] [c] (0) Change the limit for where charsets should be given to the fi… (Hixie著, ) https://github.com/whatwg/html/commit/51babfe760a1dbe28c4521b2070e692ac872550a
[25] chardetng: A More Compact Character Encoding Detector for the Legacy Web, Henri Sivonen, , https://hsivonen.fi/chardetng/
[30]
shebang はファイルの先頭に書けます。
ただし Ruby ではもっと後に来ることもあります。
[32]
XML宣言とテキスト宣言はファイルの先頭に書けます。
BOM より後になります。
[36]
#ABNF はファイルの先頭に書けます。
BOM より後になります。
[37]
#VRML, #X3D はファイルの先頭に書けます。
[29]
-*- は最初の行に書けます。ただしその前に shebang を置けます。
Emacs や Python では第2行までですが、
Ruby ではもっと後に来ることもあります。
[34] Python の符号化の魔法注釈は、 第1行か第2行に置けます。
[17]
Vim のモード行は先頭と末尾の5行に書けるとするのが既定値ですが、
変更も可能です。
[28]
Kate Modelines は先頭と末尾の10行に書けます。
[22]
資源ヘッダーの処理では、入力が短すぎるとき、長過ぎるとき、無限の長さのときの処置に注意が必要です。