最小のHTML文書とは何か

何が最小の (最短の) HTML 文書であるか、というのはたまに話題になります (実用上はあまり意味がありませんが)。答えは少し複雑です。

Web ブラウザーなどに含まれる HTML 構文解析器はどんな入力が与えられるかわかりませんから、任意の文字列を処理できる必要があります。構文解析器の立場では、空文字列 (長さ0の文字列) が最短の HTML 文書となります。

しかし任意の文字列がすべて意味のある HTML 文書を構成しているわけではありません。そこで HTML の仕様に適合するもので文字数が最短のものを考えることにします。

# 原則

HTML 文書には、最低でも [DOCTYPE](http://d.hatena.ne.jp/wakabatan/20120623/1340453066) と `html` 要素が[必要です](https://html.spec.whatwg.org/#writing)。 `html` 要素には、 `head` 要素と `body` 要素が必要です。しかし、これら3つの要素の開始タグと終了タグは、[曖昧でなければ省略できます](https://html.spec.whatwg.org/#optional-tags)。 (タグを省略しても、要素は暗黙のうちに存在します。)

`head` 要素には、原則として `title` 要素が[必要です](https://html.spec.whatwg.org/#the-head-element)。そのタグは省略できません。

HTML 文書には、特定の条件が満たされない場合には、[文字符号化宣言が必要です](https://html.spec.whatwg.org/#character-encoding-declaration)。文字符号化宣言は、 `<meta charset=utf-8>` が最短形です (属性値の引用符は省略できます)。文字符号化宣言は `head` 要素に入れる必要があります。

`body` 要素の内容モデルは[フロー内容なので](https://html.spec.whatwg.org/#the-body-element)、原則として palpable content (触知可能内容) を含める[必要があります](https://html.spec.whatwg.org/#palpable-content)。 `body` 要素は「本文」を表すのですから、むやみに空にしては意味がないということです。空白以外の適当な文字を1つ使うのが最短です。

以上から、一般的な最小 HTML 文書は

```html
<!DOCTYPE html><meta charset=utf-8><title></title>x
```

... となります (51文字)。

# 例外

条件が整えば、更に短くすることもできます。

DOCTYPE は、 `iframe` `srcdoc` 文書では、[省略できます](https://html.spec.whatwg.org/#an-iframe-srcdoc-document)。`iframe` `srcdoc` 文書とは、他の文書の `iframe` 要素の `srcdoc` 属性に埋め込まれた文書です (`<iframe srcdoc="<p>この部分が、<p>iframe srcdoc 文書、<p>です!"></iframe>`)。

`title` 要素は、 `iframe` `srcdoc` 文書の場合やプロトコルにより題名が指定されている場合には、[省略できます](https://html.spec.whatwg.org/#the-head-element)。

文字符号化宣言は、 `iframe` `srcdoc` 文書では[省略しなければなりません](https://html.spec.whatwg.org/#character-encoding-declaration)。プロトコルで `charset` が指定されている場合などには、[省略できます](https://html.spec.whatwg.org/#character-encoding-declaration)。なお、省略できない場合でも、十分な理由があれば UTF-8 以外の文字符号化を使うことができますから、 4文字以下のラベルを持つ[文字符号化](https://encoding.spec.whatwg.org/#names-and-labels)を選べば、通常より短い文字符号化宣言となります。

`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](https://www.w3.org/TR/xhtml11/conformance.html#strict) (2001年第1版 / 2010年第2版) では、

```xml
<?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](https://www.w3.org/TR/html4/struct/global.html) (1998年 4.0 / 1999年 4.01、ここでは最終版である 4.01 の場合) では、

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><title//<p>
```

... が最小形でした  (101文字)。

- 巷ではなぜかシステム識別子は省略できるとされることもありましたが、 HTML 4.01 が<a href=https://www.w3.org/TR/html4/struct/global.html#version-info>要求</a>する DOCTYPE 宣言にはシステム識別子も含まれていました。
- HTML4 は SGML 宣言で `SHORTTAG YES` とされていたので、 nestc + net = `//` で要素を閉じることができました。
- HTML4 Strict DTD では `BODY` 要素は<a href=https://www.w3.org/TR/html4/struct/global.html#h-7.5.1>空にできません</a>でした。いくつかの候補のうち、 `P` が最も要素型名が短く、しかも終了タグが省略可能です。 (本記事では以前この条件を見落として98文字としていましたが、誤りです (コメントでご指摘ありがとうございます)。) Transitional DTD および Frameset DTD にはこの条件がないのですが、公開識別子とシステム識別子の違いを加味するとむしろ長くなります。
- `P` 要素は空でないのが<a href=https://www.w3.org/TR/html4/struct/text.html#edef-P>望ましい (discourage)</a>とされていましたが、これは適合性に影響しない助言に過ぎないので、ここでは無視します。

なお「HTML4 に適合する」から「HTML4 DTD を参照しつつ、妥当である」に条件を緩めると、もっと短くできることが知られています ([47文字](http://www.damowmow.com/playground/small.html))。

[HTML 3.2](http://www.w3.org/TR/REC-html32#html) (1997年) では、

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><TITLE//
```

... が最小形でした (63文字)。

[HTML 2.0](http://tools.ietf.org/html/rfc1866#section-3.3) (1995年) では、

```html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><TITLE//
```

... が最小形でした (58文字)。

[1992年時点](https://lists.w3.org/Archives/Public/www-talk/1992JanFeb/0000.html)では何も必須のものはなく、空文字列 (0文字) が最小形だったようです。

つまり HTML5 が登場するまで、仕様上必要な文字数はどんどん長くなっていました。