制作者(webmaster)
野嵜健秀(Takehide Nozaki)
改訂
2010-07-16

文書型(DOCTYPE)宣言

文書型宣言

文書型宣言のない文書はHTML文書ではない事

いつ記述すべきか

ある文書のマーク附けが完了した時、その文書がHTMLの仕様書(DTD:Document Type Definition:文書型定義)に照らして正当であったとします。その時、あなたはその文書の先頭に文書型宣言を記述できます。

マーク附けを行った結果、その文書がHTMLDTDに適合するものである時、文書型宣言でその文書がHTML文書である事を宣言できます。あるDTDに適合した文書は、そのDTDに対応した特定の文書型宣言を記述する事が許されます。

具体的な記述の仕方は後述します。

DTDとは何か

HTMLDTD(Document Type Definition : 文書型定義)は、言ってみれば「HTMLの仕様書」です。

下手な「入門」を幾つも読むよりは、W3Cの勧告文書を参照した方が、理解し易いので、一度参照してみて下さい(原文は英語ですが邦訳もあります)。

なぜ文書型宣言を記述するか

文書型宣言は「正しいHTMLの規格に則ってこの文書は書かれたものです」と「宣言」するものです。JISマークやウールマークみたいなもので、その文書の記述が基準に適合したものである事を示すものです。

文書型宣言を記述する、しないは、自由です。ただ、W3Cが、現状の強制力のない仕様を公開したのは、「制作者が自発的に仕様に適合した文書を書く」事を期待したからではないですか。私も、「文書型宣言を書け」と、命令はしません。何かに強制されるのではなく、自分で進んで正しい書き方を選びとっていただきたい、とだけ、ここでは書いておきます。

文書型宣言がない文書

確かに全ては「自由」

現状、文書型宣言をしなくても、多くの場合、問題は生じません。HTMLの規格は、ただ「何が正しいのか」「どう書くべきか」を定めるものであり、現実の文書がどんな風に書かれたものであるかを制約するものではありません。制作者の自主性に一切は任されます。

ですから、多くのウェブサイトで公開される文書には、しばしば文書型宣言がありませんし、DTDに不適合です。そんな文書が、ブラウザなどのUser Agentによって「HTML文書」として処理されるのは、User Agentのエラー訂正機能がHTMLとして「不正」な文書の記述を「訂正」するからです。

正しいHTML文書を書く事に意味を見出さない制作者は少なくありません。しかし、プログラムのエラー訂正機能に依存して文書を作るのは、感心できません。エラー訂正機能は、あるブラウザにあっても、ほかのブラウザにはないかも知れません。

HTML文書は、ブラウザだけでなく、検索エンジンのクローラに利用される事もあります。より正しく書かれたHTML文書の方が、不正な文書よりも、検索エンジンにより高く評価され、検索エンジンで上位に位置づけられる事もあり得ます。既に、Googleでは、その様な傾向が見られます。

自由とリスク

文書型宣言がない文書をUser Agentがどんな風に解釈すべきかは、はっきりとした決りがありません。制作者は、自由にやって良いが、一定の原則から外れたら、保護されないかもしれないのです。

極端な話、文書型宣言のない文書は、HTML文書とは看做されないかもしれません。意地悪なUser Agentに意地悪く解釈されるかも知れません。逆に、HTMLとして正当な文書を記述した場合、User Agentが正しく処理して呉れない場合、あなたはメーカに文句をつける根拠と権利とを持ちます。

換言すると

変な事をしないで、普通にマーク附けをすれば、その文書は自然にHTML 4.01 Strict適合の文書となります。変な事をするから、文書型宣言を書けなくなるだけです。文書型宣言を記述できる様、普通にマーク附けをすべきです。普通が一番です。

HTMLのヴァージョン

HTMLには歴史的に複数のヴァージョンがあります。HTMLの各々のヴァージョンには、それぞれ異る DTDがあります。

DTDの定めるHTMLの仕様には差異が少なくありません。HTMLの各ヴァージョンには独自の決りがあります。

後のヴァージョンで、前ヴァージョンの要素や属性が廃止される事があります。HTMLのヴァージョンは、数字の大きいものが小さいものに対する上位互換である訳ではありません。HTML 3.2に適合した文書だからと言って、HTML 4.01にも自動的に適合するものではありません。

HTML 4.01は難かしいから、俺はHTML 3.2で書く」と主張する人がありますが、これは根本的に間違った発想です。マーク附けの結果、でき上がった文書がHTMLのあるヴァージョンのDTDに適合である場合に、その文書はHTML文書である事になり、文書の先頭で文書型宣言を記述できるのです。「はじめに文書型宣言ありき」ではありません。

具体的な記述の仕方

HTMLの場合

文書のマーク附けが終った時、その文書があるヴァージョンのHTMLの仕様に適合したものであるならば、その文書は正当なHTML文書です。その文書の冒頭に、適合するHTMLのヴァージョンに該当する文書型宣言を記述して下さい。

逆に、文書型宣言をする事で自動的にその文書が正しいHTML文書になる訳ではない事に注意して下さい。その文書が規格に適合したものであるから、文書型宣言を記述できるのであります。要注意。

具体的な宣言の書き方は以下の通りです。文書型宣言はHTMLの全ての要素が出現する以前(=html要素の開始タグよりも前)に記述します。

HTML 2.0
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
HTML 2.x(i18n:internationalization)
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">
HTML 3.2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
HTML 4.01 Strict
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
HTML 4.01 Transitional
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
HTML 4.01 Frameset
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

HTML 2.0には幾つかの仕様があり、複数の文書型宣言があります。詳細はRFCを参照して下さい。ただ、全てobsoleteです。

XHTMLに関しては、後述します。

重要な注意

文書型宣言はそのまま記述する事。

HTML 1.0、3.0は存在しません。2.0/2.xは破毀されました。

存在しないHTMLの正式なDTDは存在しませんし、存在しないDTDに対応した正式な文書型宣言も存在しません。開発途上のDTDが公開され、見る事はできます。が、飽くまで参考のために公開されたものに過ぎません。

破毀されたヴァージョンのHTMLは、かつて正式だつたDTDが存在しますが、今後作成するHTML文書で、利用すべきではありません。

HTML 4.0は一部の記述に問題があり、4.01に上書きされました。HTML 4.0用の文書型宣言は存在しましたが、新しい文書で使用すべきではありません。また、従来のHTML 4.0準拠の文書は、多くの場合そのままHTML 4.01準拠として通用しますが、必ずしも文書型宣言をすぐに書直す必要はありません。

フレーム

フレーム分割のベースになる文書では、HTML 4.01/XHTML 1.0 Framesetを宣言します。HTML 4.01 TransitionalやStrictを宣言しないで下さい。当然、HTML 3.2や2.0を宣言してはなりません。※XHTMLに関しては後述。

フレームの中に表示される文書は、どんな文書であるかはわかりません。

日本語文字コードの文字(非US ASCII文字)を利用できるHTMLのヴァージョン

国際化対応を考慮されたHTMLのヴァージョンは2.x(i18n)と4.01(及びXHTML)だけです。厳密な話をするならば、HTML 2.0及び3.2を宣言した文書で、US ASCII以外の文字を使用してあってはなりません(漢字や仮名を使用してあってはなりません)。

日本語の文書では、html要素の属性にlang="ja"と書く事がしばしば推奨されます。しかし、その文書はHTML 4.01かXHTML 1.0でなければなりません。HTML 2.0にlang属性は存在しません(HTML 2.xと4.0にのみ存在する)。

ちなみに、XHTML 1.1でlang属性は廃止になり、xml:lang属性に一本化されます。

XHTML

HTML 4.01を基に、W3CXHTML 1.0、Basic、及び1.1をHTMLの新しい規格として策定しました。(2003-05-27現在)

XHTMLに基いた文書はXML文書の一種です(XMLアプリケーション)。XHTMLを書く際にはXMLの仕様に準拠する必要があります。

XHTML文書では、文書型宣言を記述する事が強く推奨され、XML宣言を必要に応じて行っておく事が求められます。

文書の文字符号化方式により、XML宣言には差異があります。以下はサンプルです。

UTF-8
<?xml version="1.0" encoding="UTF-8"?>
UTF-16
<?xml version="1.0" encoding="UTF-16"?>
Shift-JIS
<?xml version="1.0" encoding="Shift-JIS"?>
iso-2022-jp
<?xml version="1.0" encoding="iso-2022-jp"?>
euc-jp
<?xml version="1.0" encoding="euc-jp"?>

本来XML文書では、必ずしもXML宣言を記述しなければならない訳ではありません。しかし、条件次第で、XHTMLに準拠した文書ではXML宣言を記述しなければなりません。

mimeタイプtext/htmlの場合、XHTMLの文書であっても、XMLの文書として処理されません。文字符号化方式が明示されない場合も、UTF-8/16による文書とは看做されません。

XML宣言に続いて、以下のどちらかの文書型宣言を記述します。文書のマーク附けに合せて、適切なものを記述して下さい。

XHTML 1.0 Strict
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML 1.0 Frameset
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

XMLでは要素名の大文字小文字が区別されます。XHTMLでは、ルートの要素は「小文字のhtml」でなければなりません。ですから、「DOCTYPE」の次の「html」は必ず小文字で記述して下さい。

また、system identifierの指定(DTDの在処)は、(事情があって)W3Cの例文では相対表記です。しかし、W3Cのドメインのサーヴァに置かれない文書では、きちんと絶対表記に直しておく必要があります。

ISO-HTML/JIS-HTML

ISO/IECによる「より厳格」なHTMLの仕様「ISO/IEC 15445:2000」(通称「ISO-HTML」)が存在します。この「ISO-HTML」の文書型宣言も挙げておきます。

ISO-HTML/JIS-HTML
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HyperText Markup Language//EN">

ISO-HTMLは、HTML 4.01をベースに、文書の解釈を詳細に規定したHTMLの規格です。ISO-HTML準拠の文書は、見出しを基準に、全ての段落が階層化されたものであると看做されます。

「ISO-HTML」は、JISによる邦訳があります(JIS X 4156:2000)。「JIS X 4156:2000」は、「JIS-HTML」とも呼ばれますが、ISO/IEC 15445:2000と同じ内容のものです。JISは、ただ単に、仕様書を日本語に訳したものに過ぎません。

参考資料

仕様書

外部サイトの参照すべき記事

目次