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