[18] 
[DFN[資源ヘッダー]]は、[[ファイル]]の
[[sniffing]]
に使われる部分です。


* Web における資源ヘッダー

[2] 
[CITE[MIME Snffing]]
では、
[[sniffing]] に使われる[[ファイル]]の先頭部分を[DFN[[RUBYB[資源ヘッダー]@en[resource header]]]]といいます [SRC[>>1]]。

** 仕様書

[REFS[
- [1] [CITE@en[MIME Sniffing Standard]] ([TIME[2017-03-09 23:51:04 +09:00]]) <https://mimesniff.spec.whatwg.org/#reading-the-resource-header>
- [5] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-05-05 18:17:33 +09:00]]) <https://html.spec.whatwg.org/#character-encoding-declaration>
- [7] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2017-05-05 18:17:33 +09:00]]) <https://html.spec.whatwg.org/#encoding-sniffing-algorithm>
- [11] [CITE@en[XMLHttpRequest Standard]] ([TIME[2017-04-20 18:49:47 +09:00]]) <https://xhr.spec.whatwg.org/#document-response>
- [13] [CITE@en[CSS Syntax Module Level 3]] ([TIME[2017-05-07 16:12:44 +09:00]]) <https://drafts.csswg.org/css-syntax/#input-byte-stream>
]REFS]


** MIME 型の sniffing における資源ヘッダー

[4] [CITE[MIME Sniffing Standard]] は、
先頭 [N[1445]] [[バイト]][[以上]]が読み込まれるか、
末尾に到達するか、
[[利用者エージェント]]定義の十分な時間が経過するかのいずれか最初の時点での利用可能なデータ''全体''としています
[SRC[>>1]]。

[HISTORY[
[15] 当初は [N[512]] [[バイト]]でしたが、 [[MP3]] に対応するため拡大されました [SRC[>>3]]。

[REFS[

-
[3] [CITE@en[Add an algorithm to sniff MP3 without ID3]] ([[padenot]]著, [TIME[2016-03-03 01:32:46 +09:00]]) <https://github.com/whatwg/mimesniff/commit/998b959332e8dd372f06cfde23f48b4ed5e3567c>

]REFS]

]HISTORY]


** 符号化 sniffing における資源ヘッダー

[19] [[encoding sniffing]] には[[資源ヘッダー]]という用語はありませんが、
類似の規定が各仕様にあります。

-*-*-

[6] [[HTML]] の[[文字符号化宣言]] ([CODE[<meta charset>]]) は、
[[HTML文書]]の最初の [N[1024]] 
[[バイト]]以内に含めなければ[MUST[ならない]]と規定されています
[SRC[>>5]]。

;; [21] これは[[著者]]に対する要件です。

[12] [[XHR]] の[[文書応答]]における [[HTML]] の処理 ([CODE[responseXML]]) では、
先頭 [N[1024]] [[バイト]]を使って [[prescan]] すると規定されています [SRC[>>11]]。



[8] [[HTML]] の [[encoding sniffing algorithm]] の [[prescan]] では、
[[利用者エージェント]]依存としつつも、
先頭 [N[1024]] [[バイト]]または [N[500]] [[ms]] 経過までのデータを使うことを勧めています
[SRC[>>7]]。

[HISTORY[
[9] 当初は [N[512]] [[バイト]]とされていましたが、[[Web互換性]]のため拡大されました [SRC[>>16]]。
]HISTORY]

;; [20] 処理速度を条件にいれることで、[[ネットワーク]]の偶然の転送の具合に依存してしまうことになりますが、
読み込みの速度が遅くていつまでも [[charset sniffing]] の結果を得られないことを防げます。
[[navigate]]
に限ってこのような規定があるのは、
[[incremental rendering]] が必要であること、
最初の[[レンダリング]]までの処理速度が[[利用者体験]]上特に重要であることと、
[[符号化の変更]]による修復が可能だからでしょう。

[23] ただしきっちり [N[1024]] [[バイト]]に限定することが硬い要件とされているわけではなく、
必要があればそれを超える実装も仕様に違反しません。[[ローカルファイル]]の場合など、
すぐに利用できるデータがあって、それを読むことが精度と速度のバランス上有効と思われるなら、
利用できます。

[26] 
また、 [CODE[<meta charset>]] に関する prescan の処理には
[N[1024]] [[バイト]]の推奨がありますが、その後の[[頻度解析等の手法]]には長さの制限がなく、
現実的に [N[1024]] [[バイト]]よりも多く読み込む必要がありそうです。
[SEE[ [[encoding sniffing algorithm]] ]]

[27] 
[CITE[Chrome]] は[[ネットワーク]]から最初に届いたデータに対して[[文字コードの判定]]を行います。
[SRC[>>25]]

[35] 
[CITE[Firefox]] は最初の [N[1024]] バイトが届いたら [[prescan]] や [CITE[chardetng]]
による判定を行います。本[[構文解析]]で発見された [CODE[<meta charset>]]
で異なる結果が得られれば[[符号化の変更]]を行います。
すべて読みこんだら改めて [CITE[chardetng]] による判定を行い、
異なる結果が得られれば[[符号化の変更]]を行います。
[SRC[>>24]]

[38] 
[CITE[Firefox]] の挙動は [CITE[Chrome]] の挙動だと[[ネットワーク]]の状況依存になってしまい結果が安定しないことへの批判です
[SRC[>>24]] が、
体感的には [CITE[Chrome]] が最初から正しい[[符号化]]で[[レンダリングの開始]]となることが多いのに対し、
[CITE[Firefox]] は[[文字化け]]状態で読み込んだ後に再読み込みとなることが多く、
[CITE[Chrome]] の挙動に分があるように感じられます。


;; [24] 
[[Webブラウザー]]の挙動を厳密に推定するのは難しく感覚的になってしまいますが、
[CITE[Chrome]] と比べると [CITE[Firefox]] は[[符号化の変更]]が必要となって再読み込みすることが多い
([[資源ヘッダー]]の処理で正しい判定に失敗することが多い) ように感じられます。
[CITE[Chrome]] が [CODE[<meta charset>]] の prescan で 1024 バイト以上読んでいるのか、
その他の要因によるのかは不明です。
[TIME[2025-11-09T02:10:40.400Z]]

[39] 
[[HTML文書]]の先頭には本文の前に[[文書型宣言]]や [CODE[head]] [[要素]]などが書かれます。
[CODE[<meta charset>]] がそこに書かれていればいいのですが、
それが無いときの[[文字コードの判定]]に必要な[[非ASCII文字]]はそれほど多くありません。
[CODE[title]] [[要素]]の中身が主となりますが、それすら 
[[ASCII文字]]のみで構成されることも珍しくありません。
1024バイトは意外と短いのです。

[40] 
古い [[HTML文書]]が多い [[Internet Archive]] に至っては [[HTML文書]]の先頭部分に
[[Internet Archive]] のヘッダーのための[[要素]]群が挿入されています。
そのために本文は先頭から非常に遠い部分に追いやられてしまいます。

[41] 
[[非ASCII文字]]があればいいというものではなく、
データが長ければ長いほど[[文字コードの判定]]の精度は高くできます。
1024バイト中の数バイトだけでは正しい判定が難しいことも多いです。


[42] 
それではデータをすべて使うのが常に正しいかというと、そうとも限りません。
例えば数ギガバイトの動画データが何らかの誤りで[[文字コードの判定]]処理に与えられたとき、
それをどこまで処理しても意味はありません。そこまで極端な例でなくとも、
確かに数百メガバイトの [[ASCII文字]]の後に[[非ASCII文字]]が来るという事例が考えられないわけではありませんが、
そのような[[テキストファイル]]の[[文字コードの判定]]に失敗することが実装の責めに帰するとは考えにくく、
どちらかといえば[[無制限の長いデータの処理に伴う性能その他の悪化やセキュリティー問題のおそれを防ぐこと][ハードウェア制限条項]]の方が重要です。


[43] 推奨される実装戦略:

- [44] [[prescan]] 
-- [45] 1024バイトに到達したら打ち切る
-- [46] 500 ms に到達したら打ち切る
- [47] [[頻度解析等の手法]]
-- [48] データが到着するたびに入力として供給する
-- [50] [[prescan]] の方で結果が得られたら打ち切る
-- [49] 確定的結果が得られたらそれを返して打ち切る
-- [51] 途中の暫定結果を返しつつ判定を継続
--- [52] 既に1024バイト以上あれば、1024バイト以上の部分も含め、それを最大まで使ったときに
--- [53] 500 ms に到達したときに
-- [54] 最大 (100MB程度) まで使ったら途中結果を返して打ち切る
-- [55] データの末尾に到達したら結果を返して終了


-*-*-


[14] [[CSS]] では、先頭 [N[1024]] [[バイト]]を使うと規定されています [SRC[>>13]]。

** 歴史

[10] [[MIME sniffing]]、[[HTML charset sniffing]] も参照。

[16] [CITE@en['''['''c''']''' (0) Change the limit for where charsets should be given to the fi…]] ([[Hixie]]著, [TIME[2011-02-09 09:02:05 +09:00]]) <https://github.com/whatwg/html/commit/51babfe760a1dbe28c4521b2070e692ac872550a>


[25] 
[CITE@en[chardetng: A More Compact Character Encoding Detector for the Legacy Web]], [[Henri Sivonen]], [TIME[2020-06-08T16:23:51.000Z]], [TIME[2025-11-18T12:49:24.545Z]] <https://hsivonen.fi/chardetng/>


* その他の資源ヘッダー


[33] 
[CN[BOM]] は先頭に置けます。

[30] 
[[shebang]] はファイルの先頭に書けます。
ただし [[Ruby]] ではもっと後に来ることもあります。
[SEE[ [[shebang]] ]]

[32] 
[[XML宣言]]と[[テキスト宣言]]はファイルの先頭に書けます。
[CN[BOM]] より後になります。

[36] 
[CODE[#ABNF]] はファイルの先頭に書けます。
[CN[BOM]] より後になります。

[37] 
[CODE[#VRML]], [CODE[#X3D]] はファイルの先頭に書けます。

[29] 
[CODE[-*-]] は最初の[[行]]に書けます。ただしその前に [[shebang]] を置けます。
[CITE[Emacs]] や [[Python]] では第2行までですが、
[[Ruby]] ではもっと後に来ることもあります。
[SEE[ [[-*-]], [[ファイル局所変数]] ]]

[34] 
[[Python]] の[[符号化]]の[[魔法注釈]]は、
第1行か第2行に置けます。

[17] 
[CITE[Vim]] の[[モード行]]は先頭と末尾の5行に書けるとするのが既定値ですが、
変更も可能です。 [SEE[ [[vim:]] ]]

[28] 
[[Kate Modelines]] は先頭と末尾の10行に書けます。
[SEE[ [[kate:]] ]]

[31] 
[[局所変数群並び]]はファイルの末尾の3000文字より後、
最後の [CN[FORM FEED]] より後に書けます。


* セキュリティー

[22] 
[[資源ヘッダー]]の処理では、入力が短すぎるとき、長過ぎるとき、無限の長さのときの処置に注意が必要です。
[SEE[ [[sniffing]] ]]

* 関連

[SEE[ [[sniffing]], [[テキストファイルの先頭]] ]]


* メモ