何が最小の (最短の) HTML 文書であるか、というのはたまに話題になります (実用上はあまり意味がありませんが)。答えは少し複雑です。
Web ブラウザーなどに含まれる HTML 構文解析器はどんな入力が与えられるかわかりませんから、任意の文字列を処理できる必要があります。構文解析器の立場では、空文字列 (長さ0の文字列) が最短の HTML 文書となります。
しかし任意の文字列がすべて意味のある HTML 文書を構成しているわけではありません。そこで HTML の仕様に適合するもので文字数が最短のものを考えることにします。
原則
HTML 文書には、最低でも DOCTYPE と html
要素が必要です。 html
要素には、 head
要素と body
要素が必要です。しかし、これら3つの要素の開始タグと終了タグは、曖昧でなければ省略できます。 (タグを省略しても、要素は暗黙のうちに存在します。)
head
要素には、原則として title
要素が必要です。そのタグは省略できません。
HTML 文書には、特定の条件が満たされない場合には、文字符号化宣言が必要です。文字符号化宣言は、 <meta charset=utf-8>
が最短形です (属性値の引用符は省略できます)。文字符号化宣言は head
要素に入れる必要があります。
body
要素の内容モデルはフロー内容なので、原則として palpable content (触知可能内容) を含める必要があります。 body
要素は「本文」を表すのですから、むやみに空にしては意味がないということです。空白以外の適当な文字を1つ使うのが最短です。
以上から、一般的な最小 HTML 文書は
<!DOCTYPE html><meta charset=utf-8><title></title>x
... となります (51文字)。
例外
条件が整えば、更に短くすることもできます。
DOCTYPE は、 iframe
srcdoc
文書では、省略できます。iframe
srcdoc
文書とは、他の文書の iframe
要素の srcdoc
属性に埋め込まれた文書です (<iframe srcdoc="<p>この部分が、<p>iframe srcdoc 文書、<p>です!"></iframe>
)。
title
要素は、 iframe
srcdoc
文書の場合やプロトコルにより題名が指定されている場合には、省略できます。
文字符号化宣言は、 iframe
srcdoc
文書では省略しなければなりません。プロトコルで charset
が指定されている場合などには、省略できます。なお、省略できない場合でも、十分な理由があれば UTF-8 以外の文字符号化を使うことができますから、 4文字以下のラベルを持つ文字符号化を選べば、通常より短い文字符号化宣言となります。
body
要素の内容としては palpable content が原則として必要ですが、正当な理由があれば、なくても構いません。正当な理由とは、例えば“後からスクリプトにより挿入される”のような事情です。
以上より、 body
要素の内容を空にできる場合には、次の文字列が最小の HTML 文書となります。
-
utf-8
以外のラベルを許容するなら、<!DOCTYPE html><meta charset=utf8><title></title>
(49文字)。 - UTF-8 以外の符号化を許容するなら、
<!DOCTYPE html><meta charset=l1><title></title>
(47文字)。 (l1
の他、l2
...l6
,l9
でも可。) - HTTP ヘッダーの
Content-Type: text/html; charset=utf-8
が存在するなら、<!DOCTYPE html><title></title>
(30文字)。 - 電子メールでメールヘッダーの
Subject:
とContent-Type: text/html; charset=utf-8
が存在するなら、<!DOCTYPE html>
(15文字)。 -
iframe
srcdoc
文書では、空文字列 (0文字)。
過去
参考までに、歴史的には次のように決められていました。
HTML5 (- 2011年) では、現在と同じ規定でした。
XHTML 1.1 (2001年第1版 / 2010年第2版) では、
<?xml version="1.0"?><!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title/></head><body/></html>
... が最小形でした (114文字)。ただし XML 宣言は条件が整えば、十分な理由がある場合、省略できました (93文字)。
DOCTYPE 宣言は必須でしたが、不思議なことに公開識別子とシステム識別子は (明確には) 必須とされていませんでした。公開識別子とシステム識別子を含めると (そうしないと XML 的にはほとんど意味がありません)、更に長くなります。
これでも最低限の記述で、仕様書にはもっと長い DOCTYPE 宣言や html
開始タグの記述方法が示されていました。
HTML4 (1998年 4.0 / 1999年 4.01、ここでは最終版である 4.01 の場合) では、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><title//<p>
... が最小形でした (101文字)。
- 巷ではなぜかシステム識別子は省略できるとされることもありましたが、 HTML 4.01 が要求する DOCTYPE 宣言にはシステム識別子も含まれていました。
- HTML4 は SGML 宣言で
SHORTTAG YES
とされていたので、 nestc + net =//
で要素を閉じることができました。 - HTML4 Strict DTD では
BODY
要素は空にできませんでした。いくつかの候補のうち、P
が最も要素型名が短く、しかも終了タグが省略可能です。 (本記事では以前この条件を見落として98文字としていましたが、誤りです (コメントでご指摘ありがとうございます)。) Transitional DTD および Frameset DTD にはこの条件がないのですが、公開識別子とシステム識別子の違いを加味するとむしろ長くなります。 -
P
要素は空でないのが望ましい (discourage)とされていましたが、これは適合性に影響しない助言に過ぎないので、ここでは無視します。
なお「HTML4 に適合する」から「HTML4 DTD を参照しつつ、妥当である」に条件を緩めると、もっと短くできることが知られています (47文字)。
HTML 3.2 (1997年) では、
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><TITLE//
... が最小形でした (63文字)。
HTML 2.0 (1995年) では、
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><TITLE//
... が最小形でした (58文字)。
1992年時点では何も必須のものはなく、空文字列 (0文字) が最小形だったようです。
つまり HTML5 が登場するまで、仕様上必要な文字数はどんどん長くなっていました。