2024/03/13

html のバージョンと DOCTYPE 宣言について調べてみた

…ので、記録として残します。htmlのバージョンというか標準規格は、短期間の間にいろいろ変遷があり、私にとって理解できないこともまだまだあります…ので、理解したつもりになっているところだけ、かいつまんで書いている感じです(^^;;;…スミマセン…。おまけとして、framesetタグについても調べましたので、末尾に書いてます。

htmlの主なバージョン

日本語に翻訳されているドキュメントもあります。

DOCTYPE宣言

HTML5以降でのDOCTYPE宣言は、

 <!DOCTYPE html>

だけでよいようです(※DOCTYPE宣言は大文字と小文字を区別しないそうです)。

XHTML1.1のDOCTYPE宣言は、

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

XHTML1.0のStrict/Transitional/Frameset、それぞれのDOCTYPE宣言は、

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

のように書きます。XHTMLの「X」は「Extensible」という意味なのだそうで、XML(Extensible Markup Language)という言語の仕様に従って定義しなおしたHTMLなのだそうです。…なので、1行目に「XML宣言」という「この文書が XML文書である」ことを示す1文を書くようにするようです(※XML宣言の記述は任意のようですが、存在する場合には1行目に記述するようです)。

HTML4.01のStrict/Transitional/Frameset、それぞれのDOCTYPE宣言は、

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
 "http://www.w3.org/TR/html4/frameset.dtd">

となります。ここで、

  • Strict:W3C非推奨の機能を使用できない厳格なDTD
  • Transitional:W3C非推奨の機能も使えるDTD (フレームは使用不可)
  • Frameset:W3C非推奨の機能も使えるDTD (フレームも使用可能)

というものになっているようです(※W3C:World Wide Web Consortium, DTD:Document Type Definition)。

また、XML宣言は、次のような要素から構成されています。

  • バージョン宣言:version=の内容は常に1.0で、XML宣言中で省略はできません。
  •  <?xml version="1.0"?>
  • 文字コード宣言:UTF-8は「UTF-8」、UTF-16は「UTF-16」、シフトJISは「Shift_JIS」、日本語EUCは「EUC-JP」(※大文字小文字は区別しません)。UTF-8の場合のみ省略できるようです。
  •  <?xml version="1.0" encoding="Shift_JIS"?>
  • スタンドアロン宣言:何も指定しなかった場合は no になります。yesを指定すると、外部のファイルを読みにいかないため、処理が早くなる可能性があります。
  •  <?xml version="1.0" standalone="yes"?>

DOCTYPEスイッチ

ブラウザ(視覚環境のUA:User Agent)には、DOCTYPE宣言に応じてレンダリングモードを標準準拠(standard)モードか後方互換(quirk)モードに切り替えるDOCTYPEスイッチ(DOCTYPE Switching)の機能が備えられているそうです。

通常、DOCTYPE宣言した文書型通りの標準準拠されるようになっているようですが(すなわち、標準準拠(standard)モードで動作)、DOCTYPE宣言の一部または全部が省略されていたり、スペルミスをしたりすると、後方互換(quirk)モードになってしまうようです。

後方互換(quirk)モードになってしまうDOCTYPE宣言は、スペルミス以外で、

  • HTML 4.01 Transitional/Framesetで、システム識別子(後のURL部分)を省いたもの。
  •  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    
     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
  • XHTML 1.0/XHTML 1.1で、システム識別子(後のURL部分)を省いたもの。
  •  <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
     
     <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
     
     <?xml version="1.0" encoding="utf-8"?>
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN">
  • DOCTYPE宣言そのものがないとき。
  • HTMLバージョンやDTDの指定なし、またはHTMLの古いバージョン(HTML2.0/3.2)のとき。

のようなので、HTML5以降の場合でも(すなわち、DTDがない場合でも)、DOCTYPE宣言は省略しないほうが良いようです。

余談ですが『quirk』を辞書で引いてみると『奇異 風変わり 一癖』といった意味が最初に出てきます。言いえて妙な…(^^;。

(おまけ)framesetタグについて

framesetタグは、bodyタグの代わりに使うみたいで、画面をフレームに分割して表示するもののようです。現在は非推奨の機能で、代わりに、iframeタグやdivタグとスタイルシートによるレイアウトを使うのが主流みたいですね。

使用例はこんな感じ。『とほほのWWW入門』の『<frameset> - フレームセット』のページを参考にさせていただきました。

test_frameset.html

 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
 <html lang="jp">
 <head>
     <title>framesetタグのテスト</title>
 </head>
 <frameset cols="50%,*">
     <frame src="frame1.html" name="frame1">
     <frameset rows="50%,*">
         <frame src="frame2.html" name="frame2">
         <frame src="frame3.html" name="frame3">
     </frameset>
     <noframes>
         このページはフレーム対応のブラウザでご覧ください。
     </noframes>
 </frameset>
 </html>

frame1.html

 <!DOCTYPE html>
 <html lang="jp">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>frame1</title>
 </head>
 <body>
     <p>ここはframe1です。</p>
 </body>
 </html>

これをEdgeで表示するとこんな感じになります(画像をクリックすると拡大表示します)。

(おまけ その2)バージョンが1つしか無いのに、なぜ記述しないといけないの???

xml宣言について調べていた時に思っていた疑問です。また、つい先日、メールセキュリティ(SPF, DKIM, DMARC)についてのDNSレコードを設定する必要があって、それらのバージョンも現在1つしか無いにも関わらず、バージョンの記述をしないといけなかったのです(※SPF:Sender Policy Framework, DKIM:DomainKeys Identified Mail, DMARC:Domain-based Message Authentication, Reporting and Conformance, DNS:Domain Name System)。

「バージョンが書かれていないならば、バージョン1(1.0)」とか、あらかじめ決めてしまっていれば、省略できるのになあ…、って思ってました。

自分でgoogle検索して調べる代わりに、ちょっと横着して、この機会に、今流行りのchat AIを使ってみようと思い立ち、『Microsoft Copilot』に次のような質問をしてみました。

『xmlやspf, dkim, dmarcなどでは、バージョンが1つしかないのに、それらを使用するときには、バージョンを記述する必要があります。「バージョンが書かれていないならばバージョン1」として省略するやり方もあるように思うのですが、そのようにしないのは、何か理由があるのでしょうか。 』

その答えは、

『バージョンを明示的に記述することは、将来的な拡張性や互換性のために重要です。たとえば、XML、SPF、DKIM、DMARCなどの技術は、現在バージョン1が主流ですが、これらの技術は進化し続けており、将来的に新しいバージョンが登場する可能性があります。バージョンを明示することで、異なるバージョン間での互換性の問題を避け、システムが正しく機能することを保証することができます。
(…中略…)
また、バージョンを省略すると、システムが自動的に特定のバージョンを仮定する必要がありますが、これは誤解を招く可能性があります。明示的なバージョン指定により、システムは正確なプロトコルバージョンを識別し、適切な処理を行うことができます。このように、バージョンを記述することは、技術的な明確さと将来の互換性を確保するために不可欠です。』

私の必要とする答えは「バージョンを省略すると、システムが自動的に特定のバージョンを仮定する必要がありますが、これは誤解を招く可能性があります。」の部分にあるように思うのですが、ちょっと物足りないな~と感じました。チャットなので、引き続きもう少し突っ込んで質問してみても良かったのですが、質問文を考えるのが面倒になってしまい、ここで終わりました。

私が想像するに「バージョンを省略したら、バージョン1」と規定して省略可能にすることは、できないことでもないけれど、人間の手で記述することが多いので、「バージョン1なので意図的に省略しました」というのと「うっかりバージョンの記述を忘れてしまいました」というのの区別がつかないから、というのが答えなんじゃないかなあ…、って思いました。…合ってるのかな?どうなのかな???

chat AIに上手に質問するのは難しいですね。

[参考サイト] special thanks!!

[今読んでる本↓] ※アフィリエイト広告です。

武器になるHTML [ 柴田 宏仙 ]

価格:2992円
(2024/2/24 15:43時点)

0 件のコメント:

コメントを投稿