ややマイナーな文法的誤りを集めてみました。
DOCTYPE 宣言に代表される、マーク宣言に関するのけぞり。
何だか良く分かりませんが、!DOCTYPE タグという謎のモノを解説している人たちがいます。DOCTYPE宣言(文書型宣言)はマーク宣言であってタグではないのですが、SGML の基礎も全く知らずに解説書を書いているのでしょうか。
HTML文書は <HTML> で始まります、という解説が未だにしぶとく生き残っているようです。
HTML文書は文書型宣言で始まります(その前に注釈宣言や処理命令を入れても構いませんが)。<HTML> タグは省略可能ですから書かなくてもかまわないくらいですが、文書型宣言は省略できません。
だいたい、今になっても文書型宣言について全く言及しない解説書がでてくるということには驚きを禁じ得ません。それでタイトルに「HTML4.0」なんて書いているのは詐欺だとさえ思います。彼らは何をもって「HTML4.0」だと言っているのでしょうか?
マーク付けした人間が「HTML4.0だ」と主張するのは勝手ですが、ブラウザやパーサーに「HTML4.0だ」と判断されなければ意味がありません。文書型宣言がなければ HTML2.0 とみなされる可能性も高いのです。そういうことが少しでも理解できているのなら、文書型の解説もない本に「HTML4.0」というタイトルが付けられるはずがありません。
文書型宣言をつけることが「推奨されている」とか言っている人がいますが、違います。HTML3.2 にしても HTML4.0 にしても、仕様書にははっきり必須だと書かれています。なくても良いがあった方が良いというものではなく、なければならないものです。
SGML文書は、SGML 宣言、文書型定義、文書インスタンスから成る……と、なかなかよろしい説明をしているところへ持ってきて、「SGML宣言とはこの文書が SGML だということを示す」……と来てしまった本がありました。あちゃ。
SGML宣言は、どんな文字を使うのか、どんな区切り子を使うのか、属性値の長さはどのくらいか、SGMLの機能の何を利用し何を利用しないのか、などなど、重要な規定をたくさん含んでいます。SGML宣言の読み方を参考にしてください。
開始タグの中に属性値を記す際の表記法に関する誤り。
<TABLE width=50%> とか <BODY BGCOLOR=#FFFF00> とか <FONT size=+3> なんて例をあげてる本がありますが、不可です。属性値に + や % や # が含まれるときは引用符で囲まなくてはいけません。
何を思ったか、整数値以外は全部囲まなくてはいけないと教えている本があります。それは嘘です。まあ囲んでおいても害はないのですが、やはり嘘は良くありません。
属性値に使用できるのは「引用符で囲んだ文字列」と「name token」です。つまり、後者は囲まなくて良いのです。HTML2.0 や 3.2 では半角英数と . - だけで構成された文字列がこれに該当します。HTML4 では、さらに : _ が含まれています(長さ制限もあったりしますが……詳しくは SGMLの短縮タグ機構 - 引用符の省略を参照)。
これについては、各HTMLの「SGML宣言」の部分に書いてあります。SGML宣言まで手が回らないのは分かりますが、分からないなら知ったかぶりなどしないで、「良く分かんないけどとりあえず囲んでおこう」という教え方をすれば良いのです。
……かと思うと、「文字の属性値は引用符で括り、数字は括らない傾向にあるようです」などというやたらいい加減な説明で済ませている本もあります。ちゃんと決まりがあるのですから、解説してくださいな。
HTML にはいろいろなヴァージョンがあるのですが、それに関する無知。
HTML3.2 のリファレンスを名乗っておきながらフレームがある……。
HTML3.2 にはフレームなどありません。HTML3.2はなし崩し的に FONT や CENTER を採用してしまいましたが、フレームは採用しませんでした。フレームは、HTML4.0 になってようやく採用されたものです。紹介したい気持ちは分かりますが、フライングですね。
HTML 3.2 では埋め込み式のスタイルシートは使えません。STYLE という要素は予約されていましたが、これは予約されていただけですので、使うことはできません。
もっとも、LINK要素による外部スタイルシートへのリンクは可能です。RFC1866 には
The <LINK> element is typically used to indicate authorship, related indexes and glossaries, older or more recent versions, document hierarchy, associated resources such as style sheets, etc.
(強調筆者)
などという記述があって、HTML2.0 における外部スタイルシートの使用を示唆しています。
HTML 3.2 では以下略。SCRIPT という要素は予約されていました。
意外と知られていませんが、HTML2.0 や HTML3.2 では日本語の文字を使うことが出来ません。HTML2.0 では
NOTE - The document character set is somewhat independent of the character encoding scheme used to represent a document. For example, the `ISO-2022-JP' character encoding scheme can be used for HTML documents, since its repertoire is a subset of the [ISO-10646] repertoire. The critical distinction is that numeric character references agree with [ISO-10646] regardless of how the document is encoded.
と、ISO-10646のサブセットとして ISO-2022-JP が使えると明記されていますが、符号化方式に ISO-2022-JP が使えることと JIS X 0208 の文字が使えることとは同義ではありません。SGML 宣言を見ると ISO646 とラテン拡張しか扱えないことになっています。これは HTML3.2 でも同様で、使える文字は ISO646 とラテン拡張に限られます。
そんなわけで、これらの仕様では日本語の文字が使えないのですが、まあこの辺りは大目に見ても良いような気はしています。
HTML2.0 の国際化版である HTML2.x(HTMLi18n) や HTML4 では、日本語の文字も利用可能です。
HTML3.0 は策定途中で破棄された仕様です。完成に至ったことは一度たりともありませんし、現在は使われていません。なのに、なぜか書店に HTML3.0 の解説書が置いてあったりして……。
もっとも、HTML3.0 の解説が悪いというわけではありません。ドラフト段階で書かれたまじめな解説本もあります。しかし、それはもう時代遅れです。HTML の歴史を学ぶための古文書として読むのでない限り、手を出さない方が賢明です。
書いてあったんです、表紙の帯に。HTML3.0 の本で、最新のスタイルシートも解説しているんだそうで。なぜ HTML3.0 ? HTML3.0 は、結局まとまらずに破棄された仕様なのですが……それをなぜ解説する? この時点で既に相当のけぞらせてくれますが、それにスタイルシートの組み合わせ。いやはや……。
なんか良く分かりませんが、いろいろ。
<A href="#bakera">跳ぶ</A> は、もちろんこれで良いのですが、その飛び先を指定するのに <A name="bakera"> とだけ指定して、</A> を書かない人がいます。これは誤りです。 A の終了タグは省略できません。アンカー名だけを指定するときもです。
なお、<A name="bakera"></A>のように空のアンカーを作るのは誤りではありませんが、このアンカーを認識できないブラウザもあるらしいので、あまり勧められません。……と、HTML4.0仕様書にも書いてあったりします。
PRE 要素には width という属性がありました(現在では推奨されていません)。これについて、width="100%" のように横幅を指定する、などと説明してい人がいます。
これは素人目には正しいように見えますが、とんでもない誤りです。RFC1866 を見ると、HTML2.0 の PRE は以下のように定義されています。
<!ELEMENT PRE - - (%pre.content)*>
<!ATTLIST PRE
WIDTH NUMBER #implied
%SDAFORM; "Lit"
>
<!-- <PRE> Preformatted text -->
<!-- <PRE WIDTH=...> Maximum characters per line -->
width属性の値は number とされていて、整数しか指定できません。パーセンテージなど指定できないのです。それもそのはずで、PRE の width属性は、長さではなく文字数を指定するものなのです。Maximum characters per line
とあるとおり、PRE の width 属性には一行の文字数を指定します。HTML3.2 でも、HTML4.0 Transitional でも、この属性の機能に代わりはありません。100% などという指定は出来ないのです。
IE も NN でも、PRE の width 属性は機能しません。仕様を調べずにブラウザの挙動だけ見て解説を書くと、このような誤りを犯すことになります。