| 目次 | 点数について | Another HTML-lint について |
|---|---|---|
| エラーについて | ゲートウェイサーヴィス | |
| アクセス性について | 軽いゲートウェイ | |
| おまけ | 統計情報 | |
| タグ一覧 | ||
| 色見本 |
出力されるエラーは、だいたい次のように分類されます。
各エラーが、それぞれどういう質のものなのかを * で示してあります。
あまりエラーが多いときは、チェックを打ち切るようにしています。打ち切られた行以降の文書には、もしかしたら重要なエラーが含まれているかも知れませんが、チェックされません。同じようなエラーばかり出ているときは、そのエラーをチェックしないようにしてみてから、もう一度チェックしてみるといいでしょう。
もしも、同じ行の同じエラーがずっと繰り返されている場合は、プログラムの不具合だと思われますので、是非お知らせください。
HTMLには、いろいろな仕様(ヴァージョン)があります。DOCTYPE宣言は、文書がHTMLであり、さらにどの仕様のHTMLで書かれているのかを明示するものです。DOCTYPE宣言がなくても、たいていのWWWブラウザは(自分の都合のいいように)HTMLを表示してくれますし、まじめにDOCTYPEによってHTMLの評価を変えてくれるWWWブラウザが現存するのかどうか知りません。しかし、DOCTYPE宣言は書くようにしましょう。とはいえ、Mozillaなどには対応するDOCTYPEがないので、にっちもさっちもいきません。
DOCTYPE宣言は、<!DOCTYPE 〜> という書き方をします。"!" を書き忘れていないかチェックしましょう。
HTMLの場合のDOCTYPE宣言は、<!DOCTYPE HTML 〜> となります。実は、この中にあるHTMLという記述が、HTML全体をくくる <HTML>〜</HTML> を表わしているのですが、Another HTML-lint ではHTML以外は想定していません。
この警告は減点されません。
現在 Another HTML-lint がサポートしているDOCTYPEは以下のとおりです。文法はそれぞれのタグ一覧を表示します。言い訳ですが、規則ファイルから動的に生成しているため、あまり親切な一覧ではありません。なお、以下「DOCTYPEはありません」と書いてあるのは、公開識別子がないという意味です。
DOCTYPE宣言の意味については、文書タイプ宣言の意味などを見てください。特に、宣言末の "EN" というのは、宣言されているDTDが英語で書かれているという意味で、そのHTML文書がどうこういう意味ではありません。勝手に "JA" などに書き換えてはいけません。
HTML2.0 (RFC1866) → 文法
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
HTML2.x (RFC2070) → 文法
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">
HTML3.0 → 文法
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN">
HTML3.2 → 文法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
HTML4.0 Strict → 文法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
HTML4.0 Transitional → 文法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
HTML4.0 Frameset → 文法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">
HTML4.0 Mobile → 文法
<!DOCTYPE HTML SYSTEM "html40-mobile.dtd">
ISO/IEC 15445 → 文法
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HyperText Markup Language//EN">
<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HTML//EN">
Netscape Navigator 4.0 → 文法
Navigator(Mozilla)用のDOCTYPEはありません。
Microsoft Internet Explorer 3.0 beta → 文法
<!DOCTYPE HTML PUBLIC "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN">
これは96年のβ版DTDです。リファレンスとはかけ離れた代物です。
Microsoft Internet Explorer 4.0 → 文法
MSIE用のDOCTYPEはありません。
IBM WebExplorer 1.1 → 文法
WebExplorer用のDOCTYPEはありません。
Compact HTML → 文法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD Compact HTML 1.0 Draft//EN">
NTT DoCoMo iモード → 文法
NTT DoCoMo iモード用のDOCTYPEはありません。
もしも、あなたが使用しているDOCTYPEがここになくて、そのDTDが存在している場合は、お知らせくだされば、追加できるかも知れません。
以下は、よくある間違った宣言です。
<!DOCTYPE HTML PUBLIC "HTML 3.0">
<!DOCTYPE HTML PUBLIC "HTML 3.2">
<!DOCTYPE HTML PUBLIC "-//IBM//DTD HPB HTML//EN">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD W3 HTML//EN">
最初の3つは IBM HomePage Builder が、最後のは Internet Explorer 4.0 が生成するようです。
HTML3.0 はすでに廃棄されたHTMLです。使わないようにしましょう。 *3*
![]()
DOCTYPEに宣言されているHTML3.0は、すでに廃棄されてしまった仕様です。使わないようにしましょう。
指定されている XXXX は DOCTYPE宣言と一致しません。DOCTYPE宣言を無視します。
![]()
指定されたDOCTYPEが正しいかどうか、特にスペルミスがないかチェックしましょう。
DOCTYPE宣言はファイルの先頭でなければなりません。 *5*
![]()
DOCTYPE宣言は、コメントを除くファイルの先頭に書かなければなりません。つまり、<HTML> より前に書かなければなりません。
SGML宣言や DTD宣言などと思われる `<!XXXX 〜>` は無視します。
![]()
"<!SGML 〜>" とか "<!ELEMENT 〜>" とかいう宣言は、DOCTYPEを除いてすべて無視します。実際に存在する宣言かどうかはチェックしないので、でたらめな "<!USO800 〜>" とかでも無視されます。
もしも、タグをコメントアウトするつもりで "<!IMG 〜>" などと書いているなら、それは "<!--IMG 〜-->" と書かなければなりません。
Another HTML-lint はXMLを解釈できないので、XMLに対して文法チェックしても意味がありません。実際には、"<?" はXMLに限らず、一般のシステム依存の何かの処理命令を示すマーク付けです。また、XML処理命令を閉じるのは "?>" なのですが、">" だけしか見ていません。HTML4.0にあるように、一般的には処理命令を閉じるのは ">" です。この警告は減点されません。
HTML中でのコメントは、"<!-- 〜 -->" と書きますが、この "〜" の部分に "--" を書くには注意が必要です。RFC1866では、"--" と "--" の間がコメントとみなされ、その組が複数回現れてよく、それらの組と組の間は空白文字だけが書ける、となっています。つまり、次のような書き方は間違いです。
<!----------->
<!-- FOO -- BAR -- BAZ -->
最初の例は、"--" が正しく組になっていませんし、次の例は組と組の間が空白ではありません。以下の例は正しいのです。
<!------------>
<!-- FOO --
-- QUZ -->
上の例は、ハイフン "-" が 12個で、ちょうどうまく組になるのです。
Another HTML-lint では、このような正確な仕様を調べるのではなく、単純に余計な "--" が現れただけで警告するようにしています。しかし、多くのWWWブラウザでは、このようなコメント中のハイフンの扱いについては、相当寛容です。
HTML4.0には、このようなくどくどした説明はなく、2個以上連なったハイフンは書かないように、とだけ書かれています。XML1.0でも禁止です。
RFC1866では、空のコメント "<!>" は、"--" がゼロ組のコメントとして正しいコメントとされています。でも、書かない方がいいでしょうね。混乱の元です。XML1.0にはこのような表記は存在しません。
このコメントのような記述 `<!->` は正しくありません。 *6*
![]()
次のようなのは、そもそもコメントとして正しくありません。こういうのを書いてはいけません。
<!->
<!-->
<!--->
コメント中に `<` や `>` を書くと、いくつかのWWWブラウザを混乱させることがあります。 *
![]()
HTMLの一部をまとめて
<!-- <A href="〜">なんたら</A> -->
のようにコメントアウトすることはごく普通に行なわれると思いますが、一部のWWWブラウザでは、
<!-- <A href="〜">
までをコメントとみなしてしまうものがあるそうです。これは、WWWブラウザが悪いというよりも、古いHTMLでこのような実装がされ得ていたようです。今時のWWWブラウザではこんなことはないようです。この警告は減点されません。
また、コメントを入れ子にすることはできません。
<!-- <!-- かんたら --> -->
このようなとき、多くのWWWブラウザでは、
<!-- <!-- かんたら -->
までがコメントとみなされて、残りが宙に浮いてしまいます。SGML的には「かんたら」の部分が非コメント部分とみなされてうまくありません。そのため、Another HTML-lint では、コメント中に含まれる "<" も警告の対象にしています。
閉じコメントの `--` と `>` の間には空白を入れないようにしましょう。 *
![]()
仕様上は、"<!-- 〜 -- >" と書いてもいいことになっています(XML1.0では禁止)。しかし、逆に "<! -- 〜 -->" とすることは禁じられています。このときは、< とタグ要素名の間に空白が含まれていると警告されます。
閉じコメントは `--!>` ではなく `-->` です。 *6*
![]()
読んで字の如くです。WWWブラウザによっては気を利かせて "--!>" の位置でコメントを閉じてくれますが、そうでない場合は、その後ろの記述がずっと無視されることになります。
また、コメントを "<!- 〜 ->" と勘違いしている人もあるようです。
"<!--" が現れたのに "-->" が最後まで現れなかったときの警告です。コメントを入れ子にしたりして、どこか間違えたのでしょう。
タグが "<" で始まったのに ">" が最後まで現れなかったときの警告です。
`<` と `TAG` の間には空白を入れてはいけません。 *6*
![]()
タグの開始は、"<TAG" のように続けて書かなければなりません。"< TAG" のように書いてしまうと、タグとして認めてもらえません。もしも、"<" を "<" という字の意味で書いたのなら、それはそれで "<" と書かなければなりません。これについては、実体参照に関する警告を参照してください。
特許出願用HTMLでは、これが許可されているのですが、あまりにもひどい許容なので、この場合でも警告されます。
予期せぬ `<` が <TAG> 内にあります。閉じられていないタグの可能性があります。 *6*
![]()
閉じるのを忘れたタグの後に正しいタグがある場合に出ることが多い警告です。
<A href="〜"><IMG src="〜" </A>
といった調子です。このとき、</A> の前に ">" が補われます。
もっと本当のことを言えば、実はこれはSGML的には間違っているとは言えません。SGML宣言で SHORTTAG YES のときにはタグの連続で直前のタグの > を省略してもいいことになっているからです。HTMLはどれも SHORTTAG YES です。終了タグだって、それがどの開始タグに対応するか自明な場合は </> としてもいいとか、もっといろいろあるんですが、そこまで正しいSGML的解釈をWWWブラウザに期待できません。HTML4.0などを見てください。
<TAGA> を NN行目の <TAGB>〜</TAGB> 内に書くことはできません。 *6*
![]()
タグには開始タグ <TAG> と終了タグ </TAG> の対で用いられるものが多くあります。このタグ内の要素として、何が書けて何が書けないかは明確に決められています。
HTML4.0 Strictでは、ブロックレベル要素とインライン要素の区別が厳格になっているので、「あれ? どうしてこれがエラーなの」と疑問に思うものが多いかも知れません。例えば、<BODY> や <FORM> 内に直接インライン要素を書くことができなくなっています。<A> や <INPUT> などはインライン要素なので、次のようなのは HTML4.0 Strict では誤りとなります。
<BODY>
<A>リンク</A> ← <A> は <BODY> に書けないと警告
<FORM>
<INPUT>何故? ← <INPUT> は <FORM> に書けないと警告
</FORM>
</BODY>
これは、例えば次のようにします。
<BODY>
<P>
<A>リンク</A>
</P>
<FORM>
<P>
<INPUT>何故?
</P>
</FORM>
</BODY>
DOCTYPEの意味をわからずに、「とにかくHTML4.0のやつ」と不用意に宣言している人はこの警告を大量に食らうことになります。そういう人は、とりあえずHTML4.0 Transitionalな宣言を付けましょう。
HTML4.0以外でも、気付きにくい有名なよくある(ほんとによくあるのか?)間違いとして、
<A href="〜"><H3>ぽよよん</H3></A>
というのがあります。HTML3.2やHTML4.0などでは、<A>〜</A> 内には <H3> などは書くことができません。正しくは
<H3><A href="〜">ぽよよん</A></H3>
とします。しかしWWWブラウザは寛容なので、たいていどちらもそれなりに表示します。
また、</A> を書いていない場合にもこの警告がよく出ます。
<A href="yama.html">おじいさんはやまにしばかり
<A href="kawa.html">おばあさんはかわにせんたく
なんていう書き方をしているときです。</A> は省略できないタグなので、<A>〜</A> の中に <A> が書かれていると解釈されますが、<A>〜</A> の中に <A> は書けません。
<UL> や <OL> を入れ子にしてこの警告を受け、「<UL> って入れ子にできないんだっけ」と疑問に思われる方もいるようだ。<UL> を入れ子にするには、
<UL>
<LI><UL>〜</UL>
</UL>
という風にしなくちゃならない。
<TABLE> で <TR> を書かなかったために、<TBODY> 内に <TD> が書けないと言われることもHTML4.0ではよくあります。「<TBODY> なんて聞いたこともないぞ」と驚かないでください。たいてい <TR> を忘れているために出るエラーです。
もうひとつの間違いとして、<NOFRAMES> を <HTML> 直下に書いていることがあります。多くの参考書でもそう書かれていますが、これは間違いです。正しくは、<FRAMESET>〜</FRAMESET> 内に書かなければなりません。しかもこの間違いを犯している参考書は、<NOFRAMES> ではなくて、<NOFRAME> と書いていることが多いです。<NOFRAME> というタグは存在しません。いくらWWWブラウザが <NOFRAME> を許容しているとはいえ、正しいタグを書くようにしましょう。
Laura Lemay のHTML入門に、<PRE>〜</PRE> 内に <IMG> を書く例が載っているけど、現在のHTMLでは禁止されています。これはこの本の書かれた時点のHTMLが古いからです。と、思っていたのですが、HTML1.0でもそのようなことはできないことがわかりました。HTML+ではできるようです。
HTML4.0での <INS> と <DEL> は、それらがどの要素中で使用されるかによって、書ける要素が違います。つまり、インライン要素として記述した場合はブロックレベル要素は書けません。
<P>
<INS><DIV>…これはブロックレベル要素…</DIV></INS>
</P>
この例は正しくありません。<P> の中に <DIV> は書けないからです。
<TAGA> を NN行目の <TAGB>〜</TAGB> 内に書くことはあまり薦められません。 *3*
![]()
とりあえず書いても大丈夫ですが、薦められていません。将来的に書けなくなる可能性があります。この警告は減点されません。
<TAGA> は <TAGB>〜</TAGB> 内に1度しか書けません。NN行目にもありました。 *6*
![]()
タグによっては何度も書けないものがあります。<BODY> や <TITLE> や <CAPTION> などいろいろあります。これらは、HTML中で一度だけ書けるという意味ではなく、<BODY> ならばそれを書くことができる <HTML>〜</HTML> 内で一度という意味です。<HTML> は一度しか書けないので <BODY> も一度しか書けないことになりますが、<CAPTION> は <TABLE>〜</TABLE> 内で一度です。<TABLE> は何度でも書けるので、<CAPTION> 自体はHTML中に何度も現れることがあります。
<TAGA> は NN行目の <TAGB> と同時に <TAGC>〜</TAGC> 内に書くことはできません。 *6*
![]()
例えば、あるHTMLでは、<BODY> と <FRAMESET> は、どちらも <HTML>〜</HTML> 内に書くタグですが、両方を書くことはできません。これは、このような制限のあるタグに対する警告です。
<TAGA> は </TAGB> の直後に続かなければなりません。 *6*
![]()
決まった順序で書かなければならないタグがいくつかあります。<HTML>〜</HTML> 内では、<HEAD> の次に <BODY> という順序でなければなりませんし、<TABLE>〜</TABLE> 内では、<CAPTION> を <TR> の後に書くことはできません。
<DD> は </DT> の直後に続かなければなりません。 *3*
![]()
<DL> 要素内には <DT> タグと <DD> タグが書けるのですが、ひとつの <DT> に対して、いくつも <DD> を書くようなやり方は、RFC1866では推奨されていません。
<DL>
<DT>見出し1
<DD>〜
<DT>見出し2
<DD>〜
は、もちろんいいのですが、
<DL>
<DT>見出し1
<DD>〜
<DD>〜
は、だめということです。次のように <DD> がないのはいいようです。
<DL>
<DT>見出し1
<DT>見出し2
<DD>〜
<DD> を複数続けたいような場合は、例えば <BR> を使えばいいでしょう。
これに関して、昔のHTML+のDTDで次のように定義されています。
<!ELEMENT DL - - (DT+,DD)+>
RFC1866では次のように定義されています。
<!ELEMENT DL - - (DT|DD)+>
HTML+が 1993/11、RFC1866 が 1995/11 なので、RFC1866の記述はHTML+の名残、あるいは修正漏れかも知れません。
HTML4.0には、<DD> を連続させた例が載っています。ということは、HTML4.0では、DTDどおりに、こう書いても問題なしとなったんでしょう。HTML4.0では <DD> の連続に対してこの警告は出ません。
<TAGA>〜</TAGA> 内には <TAGB> が必要です。 *6*
![]()
必ず書かなければならない要素があります。例えば、<HEAD>〜</HEAD> 内に <TITLE> は必要です。
ある種のタグは、要素が空であるのが好ましくないことがあります。例えば、
<ADDRESS></ADDRESS>
などというのでは、何のための <ADDRESS> なのかわかりません。特に、<P> を <BR> の代わりに改行の意味で使っていたりすると、</P> が省略されているとみなされて、さらにこの警告が出ることが多くなります。<P> は段落のためのタグであり、改行のためにあるのではありません。
また、
<A name="anchor"></A>
としたのでは、Lynxなど一部のWWWブラウザではそこに飛べなくなってしまいます。文法的には間違っていないし、同じ場所に複数の名前を付けたりするのはよくやることだと思いますし、そもそもアンカーはその点に指定するのであって、ある範囲に指定するのではありません。Lynxなどが飛べないのは、不具合に近いと思います。なお、最近のLynx(2.8.1)ではそのようなことはないようです。
<TAG> は不明なタグです。 *5*
![]()
文字どおり間違ったタグを書いています。スペルミスなどの可能性があります。多くの参考書で紹介されている <NOFRAME> というのは <NOFRAMES> の誤りです。また、<CENTER>〜</CENTER> はあっても、<LEFT>〜</LEFT> なんてのはありません。
各HTMLがどういうタグをサポートしているのかの一覧もあるので参考にしてください。
チェックしているHTMLのヴァージョンではサポートされていないが、他のヴァージョンでサポートされているタグです。あまりこの警告が大量に出るようなら、DOCTYPE宣言が適切でない可能性があります。 各HTMLがどういうタグをサポートしているのかの一覧もあるので参考にしてください。
このタグは、すたれつつあるタグです。将来はサポートされなくなる可能性があるので、使わないようにしましょう。例えば、次のように代替のタグを使います。
<CENTER> → <DIV align="center">
<ISINDEX> → <INPUT>
<XMP> → <PRE>
<APPLET> → <OBJECT>
ただし、HTMLのヴァージョンによって警告されるタグが異なりますし、単純に要素名だけ替えればいいというわけではないので注意してください。
<TAG> はあまり薦められないタグです。スタイルシートを使いましょう。 *3*
![]()
HTML4.0では、<FONT> や <U> などが薦められないタグになっています。これらのタグは、文書構造を記述するという本来の目的からは外れたタグとして、スタイルシート(CSS1/CSS2)を利用しなさい、ということのようです。それにしては、<B> や <I> などは外されていません。
とはいっても、スタイルシートをサポートしてるWWWブラウザなんて最近のMozillaとMSIEくらいだし、そいつらもまともにはまだサポートしてないし、二の足踏んじゃいますね。この警告は減点されません。
<BLINK> や <MARQUEE> といったタグは使うべきでないと、WAI で名指しで強く主張されています。
ここに <TAG> が省略されているようです。省略しないようにしましょう。 **
![]()
開始タグの省略は、HTMLではあまり行なわれないようですが、仕様上は省略が許されているタグがあります。<HTML> や <HEAD>、<BODY> などの開始タグは省略することができます。だからといって、省略はしないようにしましょう。
タグのひとつもないプレーンなテキストをHTMLとして評価しようとすると、省略可能なタグが補われて、次のようなHTMLだとみなされますが、<HEAD> に必要な <TITLE> が含まれていないので、正しいHTMLとはなりません。<TITLE> タグは省略可能ではないので、自動的に補うことができません。
<HTML>
<HEAD>
</HEAD>
<BODY>
テキスト
</BODY>
</HTML>
こんなのは勘弁して欲しいものです。
HTML4.0で拡張されたタグのうち、古いヴァージョンとの互換のために開始タグの省略できるものがあります。例えば、HTML3.2などでの次のようなTABLEがそうです。
<TABLE>
<TR><TD>うはうは</TD></TR>
</TABLE>
これはHTML4.0では
<TABLE>
<TBODY>
<TR><TD>うはうは</TD></TR>
</TBODY>
</TABLE>
とみなされますが、<TBODY> と </TBODY> は省略できます。この警告は減点されません。
省略可能である終了タグは、たくさんあります。HTML3.2では、次のタグの終了タグは省略して構わないことになっています。他のHTMLではまた違います。
<HTML> <HEAD> <BODY> <PLAINTEXT>
<P>
<DT> <DD> <LI>
<TR> <TH> <TD>
<OPTION>
これらのうち、普通は省略して用いられる <DT> から <OPTION> の 7種のタグ以外の終了タグを省略したときは、この警告が出ます。これらの終了タグは、積極的に省略せよ、という意味ではなくて、省略してもいいけどほんとは書いた方がいいんだよ、というものです。また、</P> が、過去との互換のために省略できるなどというのは間違いです。過去(HTML1.0)との互換性はありません。
例えば、<DL>〜</DL> 中には <DT> と <DD> しか書けないので、
<DL>
<DT>かくかくしかじか
のような場合でも、</DT> は、次の <DT> か <DD> か </DL> のいずれかの直前にあるとみなすことができます。一方、
<P>まるまるくまぐま
のようなときは、<P> の書ける場所があまり限定されていないので、</P> を、このHTMLを書いた人がどこに想定しているのかあまり明確ではありません。
<P>高名なある博士の論文に次のような記述があります。
<BLOCKQUOTE>金太郎と桃太郎は同一人物である。その根拠は…</BLOCKQUOTE>
これを読んだときは目から鱗でした。</P>
これは、どう見ても <BLOCKQUOTE> が <P> の中に書けると誤解している書き方です。これは次のようにしてください。
<P>高名なある博士の論文に次のような記述があります。</P>
<BLOCKQUOTE>金太郎と桃太郎は同一人物である。その根拠は…</BLOCKQUOTE>
<P>これを読んだときは目から鱗でした。</P>
また、<P> を改行の意味で使用していることもあります。<P> は段落の意味のタグなので、これは好ましくありません。
〜というわけです。<P>
<TABLE>〜
このようなとき、<TABLE> は <P> の中に書けないので、<TABLE> の前に </P> が省略されているとみなされ、<P> は <BR> じゃないと言われ、さらに開始タグと終了タグの間が空だと警告されます。これは次のように書きます。
<P>〜というわけです。</P>
<TABLE>〜
このように、<P>〜</P> の間に書いてはならないタグを書いていることが多いので気を付けましょう。
<P align="CENTER"><HR></P>
などというばかなコードを吐き出すHTMLエディタもあります。これはまったく意味不明なコードです。<HR> を <P> の外に出してください。<P>〜</P> が空になったらその <P>〜</P> は捨ててください。
ここから先は私見です。
<P> はパラグラフだ。パラグラフ中に引用など別のブロックを含めることは、上の金太郎の例もそうだが、よくあるであろう。例えば、
具体的には、
1. ごじらの場合
2. もすらの場合
3. ふらんしーぬの場合
というようなケースが考えられます。
なんてのを、HTML文法に則って構造化しようとすると、<OL> を <P> に含められないので
<P>具体的には、</P>
<OL>
<LI>ごじらの場合
<LI>もすらの場合
<LI>ふらんしーぬの場合
</OL>
<P>というようなケースが考えられます。</P>
という風に書くと思うけど、これは、どう考えてもおかしい、と感じているのは私だけではないようだ。自然な構造は、
<P>具体的には、
<OL>
<LI>ごじらの場合
<LI>もすらの場合
<LI>ふらんしーぬの場合
</OL>
というようなケースが考えられます。</P>
という入れ子構造だと思うが、HTMLはこれを許してくれない。
</LI> や </DT> などの省略が自明な場合に出ます。上の解説を参照してください。この警告は減点されません。
<P> を連続して
<P>ほにゃらら
<P>へにょろろ
のように用いているとき、この場合「ほにゃらら」の後ろの </P> は省略が自明だとみなされます。「へにょろろ」の後ろの </P> は、さらに <P> が続けば自明な省略とみなされますが、そうでない場合は自明とはみなされません。
Laura Lemay のHTML本では </LI> は存在しないものとして解説されているけど、この本が書かれた時点のHTMLがそうだったからに過ぎず、現在のほとんどのHTMLでは </LI> は存在します。これを鵜呑みにして </LI> を存在しないものとしているお馬鹿な参考書もあるので気を付けましょう。
ところが、残念なことにHTML4.0対応を謳ったHTML入門第2版でも「<LI> に終了タグは存在しない」と書かれているので注意してください。このシリーズ、初版から内容の全面的見直しをしてないようだ。
終了タグ </TAG> には属性を指定することはできません。 *6*
![]()
終了タグには、一切の属性を指定することはできません。
<TAG> には終了タグ </TAG> はありません。 *6*
![]()
<BR> のようなタグには終了タグ </BR> は存在しません。ただし、HTMLのヴァージョンによって、終了タグのあるものとないものがあります。例えば、HTML3.2などでは <BASEFONT> に終了タグはありませんが、Mozillaの場合は </BASEFONT> が存在します。
<TAG>〜</TAG> 内の先頭/末尾に空白文字があります。 *
![]()
これは、次のような書き方はしないように警告します。
<A href="〜">
<IMG src="〜">
</A>
開始タグ直後と、終了タグ直前に空白や改行を入れないようにしましょう、ということです。この例だと、多くのWWWブラウザでホットスポットを表現する下線が、イメージの右下に髭のように表示されます。
この例は次のように書きます。
<A href="〜"><IMG src="〜"></A>
開始タグ直後の空白については、例えば <LI> 直後に入れた場合、実装によってはリストの先頭が不揃いになることがあるようです。しかし、HTML4.0には空白を先行させている例が沢山載っています。
Introduction to HTML3.2 には、開始タグ直後の改行と、終了タグ直前の改行は無視されるようなことが書いてあります。つまり、上の <IMG> の例は等価でなければなりません。しかし、既存の多くのWWWブラウザはこれを守っていません。
HTML4.0では、開始タグ直後の空白や終了タグ直前の空白は表示されると思ってはいけないようなことが書いてあります。そのとおりならば、
<P>We offer free<A href="〜"> technical support </A>for subscribers.</P>
なんて書くと、単語が繋がってしまうはずなので、こんな風に書くべきでないということになります。これは次のようにします。
<P>We offer free <A href="〜">technical support</A> for subscribers.</P>
この警告は、状況を細分して減点したりしなかったり制御すべきなのですが、そこまでできていません。つまり、インライン要素の開始タグ直後の空白のみ減点し、他は非減点にすべきであろうと考えています。とりあえず、この警告は減点されません。
</TAG> に対応する開始タグ <TAG> が見つかりません。 *6*
![]()
ほとんどの開始タグは省略できないので、それらの開始タグなしに終了タグは存在し得ません。開始タグを消したときの修正漏れの他に、タグの入れ子関係がおかしくなっているときの副作用のこともあります。
<TAGA> は NN行目の <TAGB> と重なり合っているようです。 *6*
![]()
次のように、開始タグと終了タグの関係が入り乱れているときにこの警告が出ます。
<P>むかしむかし<BIG>でかい桃が</P>どんぶらこ</BIG>
このような単純な間違いはいいのですが、タグの入れ子が深いときなど、ひとつタグを間違えただけで、この警告がたくさん出ることがあります。
入れ子にできるタグのレベルは、SGML宣言の QUANTITY TAGLVL で指定されていて、たいてい 100です。
NN行目の <TAG> に対応する終了タグ </TAG> が見つかりません。 *6*
![]()
省略できない終了タグを書いていないときに警告されます。よく、</A> を書いていないことがあります。WWWブラウザによっては適当に </A> を補ってそれなりのリンクが張られるものもありますが、全然うまくいかない場合もあります。この </A> を書いていないケースでは、<A> の中に <A> を書いていると警告されることも多いです。
省略できる終了タグについても目を通しておいてください。
<TAG>〜</TAG> 内に普通のテキストを書くことはできません。 *6*
![]()
<HEAD> や <UL> などの要素には、決められたタグしか書けません。
<UL>なんじゃこりゃ</UL>
みたいに書くことはできないわけです。これは、
<UL><LI>なんじゃこりゃ</UL>
が、正解です。
HTML4.0 Strictでは、<BODY>〜</BODY> 内にも普通のテキストを直接書くことはできなくなっています。つまり、
<BODY>
例えばこういう風に書く
</BODY>
とは書けないのです。正しくは、次のようにします。
<BODY>
<P>
例えばこういう風に書く
</P>
</BODY>
このように、<BODY> にはブロックレベル要素しか書けません。
<TAG> におかしな文字列 `XXX` があります。 *6*
![]()
タグの要素名や属性名は、(いわゆる半角の)英数字、ピリオド "."、ハイフン "-" から成り、先頭は英字です。HTML4.0では、下線 "_" とコロン ":" も書けるようになっています。属性値に空白など他の文字を含めたいときなどは引用符で囲む決まりです。タグ内の引用符の外側に、これら以外の文字があったときに警告されます。よくあるのが、ハイフンと下線 "_" を間違えているケースや、属性の区切りに全角空白を書いていたり、属性名を全角にしているケースです。ひとつでもこういうのがあると、そのタグ内でこのエラーがたくさん出ます。
予期しない "<" が現れたときの警告についても見てください。
要素名や属性名の大文字小文字を統一するようにしましょう。 *
![]()
タグの要素名や属性名の大文字小文字は同一視されるので、次はすべて同じです。
<BLOCKQUOTE>
<BlockQuote>
<blockquote>
HTML中でこれらを大文字か小文字かどちらかに統一して書いていた方が美しかろう、という(多分に宗教臭い)警告です。要素名、属性名それぞれ独立にチェックされます。HTML4.0のリファレンスでは、要素名は大文字、属性名は小文字で書かれていて、その理由は読み易くするためだ、と言ってます。
この警告は、Weblintを引き継いだ警告で、減点されません。
<TAG> に不明な属性 `ATTR` が指定されています。 *5*
![]()
間違った属性が指定されています。スペルミスなどの可能性があります。しかし、参考書があからさまに間違った解説をしていないとも限りません。例えば、Mozillaを解説したある参考書では、<LAYER> に名前を付けるのに NAME 属性を使うよう指導しています。Netscape社のサイトを見ればわかりますが、これは ID 属性の誤りです。
<TAG> に XXXX 用の属性 `ATTR` が指定されています。 *5*
![]()
チェックしているHTMLのヴァージョンではサポートされていないが、他のヴァージョンでサポートされている属性です。あまりこの警告が大量に出るようなら、DOCTYPE宣言が適切でない可能性があります。
<TAG> の属性 `ATTR` はあまり薦められない属性です。 *3*
![]()
この属性は、すたれつつある属性です。将来はサポートされなくなる可能性があるので、使わないようにしましょう。
<TAG> の属性 `ATTR` はあまり薦められない属性です。スタイルシートを使いましょう。 *3*
![]()
スタイルシート(CSS1/CSS2)での代替を薦められている属性です。残念ながら、これらの属性すべてがスタイルシートで置き換え可能なわけではありません(CSS2では可能?)し、スタイルシートをサポートしていないWWWブラウザのためには使わざるを得ないとも思います。この警告は減点されません。
<TAG> の ATTR 属性の前には空白を入れましょう。 **
![]()
属性の指定を
<BODY bgcolor="#FF00FF"link="#808080">
のように続けて書いているときに警告されます。この例では link の前に空白がありません。
<TAG> で ATTR 属性の指定が繰り返されています。 *5*
![]()
タグで指定する属性は、同じものを何度も指定することはできません。
<BODY bgcolor="#FF00FF" bgcolor="#808080">
なんてのはだめです。
タグによっては、必ず指定しなければならない属性のあるものがあります。HTML3.2の <BASE> のHREF属性などがそうです。また、<AREA> のALT属性は必須です。<IMG> の ALT はHTML3.2では必須ではないのですが、HTML4.0では必要な属性となっています。ALT属性の使用を促す警告も見てください。
<TAG> の ATTR 属性には属性値が必要です。 *5*
![]()
多くの属性は属性値を伴って指定されます。
<BR clear>
では不完全です。
<BR clear="all">
のように属性値を正しく指定しましょう。
<BR clear=>
なんて書いたときは別の警告が出ます。
<TAG> の ATTR の属性値が指定されていません。 *6*
![]()
属性値が = の後ろに指定されていません。
<A name=>
のように書いてしまったときにこの警告が出ます。
<TAG> の ATTR の属性値が複数行に渡っています。 *
![]()
引用符で囲んだ属性値は、行をまたいで書いても構いません。改行はただの空白と同じ扱いです。
<AREA shape="rect" coords="10, 12,
50, 76">
とかいう具合なんですが、まあ、一応警告しときます。この警告は減点されません。
<TAG> の ATTR の属性値区切りの = 前後に空白が含まれています。 *
![]()
RFC1866では、属性と属性値とを区切る = の前後には空白を含めてもいいことになってるんですが、それをわざわざ警告するHTMLチェッカも存在するのでこの警告があります。この警告は減点されません。
<TAG> の ATTR の属性値の引用符が閉じられていません。 *3*
![]()
属性値を引用符で囲んでいる場合、その中に ">" が現れると、タグが閉じられてしまう可能性があります。
<IMG src="〜" alt="a>b">
のようなのは、
<IMG src="〜" alt="a>b">
と、実体参照を用いて書くようにしましょう。これについては、RFC1866で言及されていて、本来は間違いとは言えないのですが、実際に引用符を閉じ忘れている場合との区別が厳密にはつかないため、Another HTML-lint では文法的な間違いとしています。
<TAG> の ATTR の属性値が 'XXXX' と書かれていますが、"XXXX" の方が安全です。 *
![]()
属性値の文字列を囲む引用符には、二重引用符 "〜" と単引用符 '〜' のどちらでも使用できます。これらの使い分けは、主に二重引用符自身を表現したいときに、いちいち " と書くのがわずわしいので単引用符で囲む、というものです。
"We say "So!""
'We say "So!"'
これらは、どちらも同じです。しかし、単引用符を解釈しないWWWブラウザが存在するそうです(私は知りませんが)。この警告は減点されません。
ところで、ある参考書に "〜" 中に " を書くには \" とするなどと書いたのがありました。どうしてそんな解説が書けるのか不思議でなりません。JavaScript中などとごっちゃになってるんですかね。
<TAG> の ATTR の属性値 `XXXX` は引用符で囲まなければなりません。 *6*
![]()
属性値を必ずしも引用符で囲む必要はありません。値が英数字、ピリオド "."、ハイフン "-" から成り(いずれも半角の)、72文字(半角換算)以内の文字列のときは引用符で囲む必要はありません(実際はこれらの制限はSGML宣言の QUANTITY NAMELEN で行われて、HTML4.0では 65536です)。そうでない文字列は、引用符で囲まなければなりません。-5 は囲まなくてもいいですが、+5 は囲まなければなりません。Cプログラマの方は、下線 "_" が含まれていないことに注意してください。
<A href="〜" target=_top>
は
<A href="〜" target="_top">
と書かなければなりません。ただし、HTML4.0では、名前文字に下線 "_" とコロン ":" が追加されているので、_top を引用符で囲む必要はないのですが、他のHTMLのことも考えれば囲んだ方が安全です。
Laura Lemay の続HTML入門に、<FONT SIZE=+5> とか <HR WIDTH=90%> とかいう例が載っているけど、これらは間違いです。
<TAG> の ATTR の属性値 `XXXX` は引用符で囲んだ方が安全です。 **
![]()
HTML4.0で、下線 "_" やコロン ":" を含む文字列を引用符で囲んでいないときにこの警告が出ます。他のHTMLのことも考えれば囲んだ方が安全です。
<TAG> の ATTR の属性値 `XXXX` が引用符で囲まれていません。 *
![]()
引用符で囲む必要のない裸で指定されている属性値に対して、注意を促します。これは、好みで全部囲まなきゃ気が済まないときなどにチェックするようにしましょう。それ以外ではたぶん不要です。この警告は減点されません。
<TAG> の ATTR の属性値 `XXXX` は空白文字が先行または後行しています。 *
![]()
決まった値や数値などを取る属性の値に空白を先行、後行させたときに出ます。
<P align=" center">
<UL type="disk ">
<LI value=" 5 ">
これらが間違いかどうかはよく知らないのですが、文書記述言語SGML(内容は日本工業規格だからそれなりだけど、HTMLとしては無惨極まりない)の 6. 要素構造 によると、正しくないように読めます。
<TAG> の ATTR の属性値 `XXXX` はあまり薦められない値です。 *3*
![]()
この値は、すたれつつある値です。将来は指定できなくなくなる可能性があるので、使わないようにしましょう。
<TAG> の ATTR の属性値に空の値を指定することはできません。 *5*
![]()
決まった値や数値などを取る属性は、値に空を指定することはできません。このような属性は多数あります。
<P align="">
<UL type="">
<LI value="">
これらはいずれも正しくありません。<IMG alt=""> のように、空にできる属性もあります。
<IMG src=""> のようにURLを空にした場合は違う警告が出ます。
<TAG> の ATTR の属性値が 1024文字を超えています。 *6*
![]()
HTMLにおける属性値は 1024文字(半角換算)以内でなければなりません。これは、SGML宣言の QUANTITY LITLEN で指定されるもので、HTMLごとに違っているのですが、1024に決め撃ちです。ちなみにHTML4.0では 65536です。
<TAG> の ATTR の属性値 `XXXX` は正しくありません。 *5*
![]()
属性値として、取り得る値が決められているものが多くあります。例えばALIGNにはLEFT、CENTER、RIGHTのいずれかしか書けないとか、WIDTHは数字だけか%付きの数字だとか、フォントのSIZEは 1〜7 だとかです。
BGCOLORなどの色の指定は、"#00FF80" のような特別な形式でRGBを指定するか、決められている色の名前を指定します。HTML3.2やHTML4.0では 16色に名前が付けられていますが、MozillaやMSIEでは拡張されていて全部で 140色の名前が付いています。
ACCESSKEY属性は、ASCII1文字しか指定できません。
フォームコントロールなどで指定するTABINDEX属性の値は、HTML4.0で、0〜32767 の範囲に制限されています。
ID属性は、属性名などと同じに、英字から始まり英数字とハイフン "-" とピリオド "." から成らなければなりません。HTML4.0では、下線 "_" とコロン ":" が追加されました。
より詳しくは、HTML4.0を参照してください。
<TAG> の ATTR は属性名と属性値が同一です。属性名を省略して属性値だけの指定にしましょう。 **
![]()
例えば、
<DL compact>
というのは、
<DL compact=compact>
の属性名の compact= の部分を省略した書き方です(属性値を省略しているのではありません)。したがって、本来ならばこのような省略しない書き方もできるはずなのですが、こういうのを解釈しないWWWブラウザもあるようです。省略した書き方をするようにしましょう。
<TAG> の `XXXX` は属性名 ATTR が省略されていますが、うまく評価されないかも知れません。 **
![]()
属性名の省略は、何も compact=compact のような場合だけではなく、
<P center>
のように書いてもいいことになっています。これは、
<P align=center>
の省略形です。こういうのは、他に center という値を取る属性が存在しないときに可能なのですが、ここまで省略形をきちんと解釈してくれるWWWブラウザはなかなかないようです。
HTML4.0で <TABLE border> という風に書くと、これは、<TABLE frame=border> と解釈されるので注意してください。
実体参照 `&xx` の後ろには `;` を書きましょう。 *3*
![]()
実体参照というのは、< や & みたいな書き方のこと(正確には後者は文字参照)で、テキスト中に "<" や ">" など直接表現できない文字を書くときの方便です。実体参照は "&" で始まって ";" で終わります。SGMLでは、終わりのセミコロンは、省略が自明な場合は書かなくてもいいことになっています。例えば、
abc < xyz
なんていうのは、OKなんですが、HTML4.0ではそんな省略はしないようにと書かれています。
"<" や ">" など実体参照で参照される名前は、HTMLごとに決まっています。大文字小文字が区別されるので、"&" のつもりで "&" と書くことはできません。WWWブラウザによっては同一視しているものもあるようですが、本来は間違いです。また、
abc<xyz
という風にしてしまうと、"<xyz" が実体参照だとみなされてしまいます。
CGI呼び出しでのパラメタ区切りは歴史的に & です。この & も & と書かなければならないことに注意してください。
<A href="uso.cgi?foo=1&bar=2">
ではだめです。
<A href="uso.cgi?foo=1&bar=2">
としなければなりません。& のままで動作するのは偶然です。上の例では、たまたま &bar という実体が定義されていないからに過ぎません。
<A href="uso.cgi?lt=1>=2">
では、
<A href="uso.cgi?lt=1>=2">
と解釈されてしまいます。
CGI呼び出し中でも実体参照を用いなければならないことは、RFC1866 8.2.1 や、HTML4.0などに書かれています。これにからんで、パラメタ区切りは "&" じゃなくて ";" にしましょうとも書かれていますが実際そうなりつつあるんでしょうか。少なくとも、Perlの非標準のライブラリ cgi-lib.pl は、どちらの区切りでも受け付けてくれますが、標準の CGI.pm は ";" を解釈しません。
プロバイダ指定のCGIを利用する場合、この "&" を実体参照で解説しているものはまずありません。言われたとおりに書かなけりゃ動かないと脅されていると思いますが、"&" と書き直してみてください。動くはずです。これは、CGI側の制約ではなくWWWブラウザ側の問題だからです。ちなみに、古いOmniWeb1.0ではURL中の実体参照が展開されないそうです。
文字参照 `&#NNN;` は限界を超えた文字コードです。参照できるのは `&#MMM;` までです。 *6*
![]()
& のような文字参照で参照できる文字コードは、HTMLごとに定められています。例えば、HTML2.0やHTML3.2では 255まで、HTML4.0では 1114111までです。これはSGML宣言に記述されています。これより大きな値を与えると警告されます。MozillaやMSIEではチェックされません。
メタ文字 `X` は `&xx;` と書かなければなりません。 **
![]()
<SCRIPT> など一部のタグの要素を除いて、"<" や "&" などをテキスト中に直接書くことはできない、と思ってください。つまり、書きたければ実体参照を用いて、"<" や "&" と書きます。<PRE> 中にはそのまま書けると思っている人もいるようですが、<PRE> 中でも実体参照を用いなければなりません。
本当は、
abc & lt xyz
のように書くと、この "&" は実体参照ではないのが明らかなので、正しく "&" と表示されます。これはSGML的に誤りではないのですが、ちゃんと実体参照を用いて書くようにしましょう。
HTML4.0では、16進数の文字参照が記述できるように拡張されています。水 のように行ないます。これは、SGMLにはありません。HTML4.0以外で 16進数の文字参照を行なうとこのエラーが出ます。これについての議論は、Proposed TC for WebSGML Adaptations for SGML K.4.1 Hexadecimal character reference にあります。
テキスト中の `"` は `"` と書きましょう。 *
![]()
安全のために、テキスト中の引用符 " を実体参照を用いて表現するように促す警告です。実際にはその必要はありません。この警告は減点されません。
<HTML> には LANG 属性を指定するようにしましょう。 *3*
![]()
<HTML> には、LANG属性を使ってその文書の言語を明示しておくことがWAIで薦められています。日本語の場合は次のようにします。
<HTML lang="ja">
<HEAD>〜</HEAD> 内に <LINK REV="MADE" HREF="mailto:〜"> が含まれていません。 *
![]()
Lynxなどの一部のWWWブラウザは、この情報を解釈して、このメールアドレスへ直ちにメールを出したりできます。HTML作者を明示するためにも、このタグは入れるようにしましょう。
しかし、古いMozillaは <LINK> タグをサポートしていないので、このタグをせっかく書いても、Another HTML-lint ではエラーが出ますが、気にしないでください。Mozilla4.0 になってようやく <LINK> がサポートされました。
と、指定を薦めているにもかかわらず、HTML4.0では、リンク形式に MADE は含まれていません。この警告は減点されません。
<HEAD> 中に <LINK REL="NEXT" HREF="〜"> などのナヴィゲーション用のリンクが含まれていません。 *3*
![]()
<LINK> を用いて、複数のHTML文書間の関係を記述することができます。
<LINK rel="INDEX" href="./index.html">
<LINK rel="NEXT" href="chapter3.html">
<LINK rel="PREV" href="chapter1.html">
ここでは、次のナヴィゲーション用のリンク形式の指定をチェックしています。どれも指定されていないときに警告されます。
Mosaicなどの一部のWWWブラウザはこれらを解釈することができます。このナヴィゲーション情報についてはWAIで用意するように指示されています。この警告は減点されません。
<LINK> の REL の属性値 `CONTENT` は `CONTENTS` の誤りだと思われます。 **
![]()
ナヴィゲーション用に目次ページを示すのは複数形の "CONTENTS" です。
<META NAME="robots"> は大文字で `ROBOTS` でなければなりません。 *3*
![]()
<META> で検索ロボットに対して何か指示するとき、NAME属性の値は大文字の "ROBOTS" でなければならないとHTML4.0に書かれています。
<META NAME="ROBOTS"> に指定されている CONTENT 属性の値 `XXXX` は正しくありません。 *3*
![]()
検索ロボットについてHTML4.0中にも言及があります。CONTENT属性に記述できるのは、"ALL"、"INDEX"、"NOFOLLOW"、"NOINDEX" で、しかもそれらの大文字小文字は区別されます。
<HEAD>〜</HEAD> 内に <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="〜"> が含まれていません。 **
![]()
現在日本語で書かれているHTMLの多くには、文字コードとして JIS、Shift JIS、EUC が利用されています。HTMLがどのコードで書かれているのかを明示するために、このタグを書くようにしましょう。
<META http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
これらのどれか適切なものを書けばいいのです。こうしておくと、よくできたWWWブラウザでは、文字コードのエンコーディングが欧米などになっていても、正しく日本語が表示されます。Mozillaなどでは、表示するフォントを指定されている文字コードごとに指定できるようになっています。<META> で文字セットを指定していると、それに対応したフォントで表示してくれます。
また、<META> での文字セットの指定がない場合、文字コードのエンコーディングを日本語(自動判別)にしてあると、Shift JIS と EUC の誤認識をすることもあるようです。
RFC1866によれば、本来は、この <META> の情報は、HTTPサーバが解釈して適切なHTTPレスポンスヘッダを生成できるようにするためのものなのです。つまり、WWWブラウザのためのものではありません。レスポンスヘッダ中に正しい文字セット指定があれば、WWWブラウザは何の問題もなく正しく表示できるはずなのです。が、現在の多くのHTTPサーバはそんな面倒な処理はしないので、なかなかうまくいかないようです。
HTTP1.1 (RFC2068) では、HTTPレスポンスヘッダにCHARSETパラメタを含めることが義務付けられています。こうなると、HTML中での <META> での文字セットの指定は無用の長物と化します。<META> による指定と、ビットパタンによる文字セットの推測は、正しくCHARSETパラメタをHTTPレスポンスヘッダに含めない日本のための過渡的な救済措置なのだそうです。XMLでは、文書中の指定は無視され、CHARSETパラメタが必須です。HTML5.0でもそのように改訂される可能性があるそうです。詳しくは「charsetパラメタの勧め: HTMLにおける文字符号化スキームの明示方法」を参照してください。
これらは、HTTP経由での送受信を前提とした話なので、ローカルなHTMLには適用できません。ローカルなHTMLでは、CHARSETの指定は <META> で行なって構わないようです。
HTTPサーバがリソース中の情報を参照するのはたいへんなので、ASAHI-Netでは、ファイル名の拡張子による Content Negitiation を実験的に導入しています。これは、言語優先機能に加えてCHARSETの指定も行なえるようにしたもので、例えば、
hello.html.ja (日本語版のHTML)
hello.html.en (英語版のHTML)とあった場合、WWWブラウザの言語の設定によって hello.html というリクエストでどちらかを自動的に振り分けて表示します。さらに、リソースの文字セットを次のように明示することができます。いずれも hello.html というリクエストで済みます。
hello.html.ja.jis (ISO-2022-JPで書かれた日本語版のHTML)
hello.html.en.8859-1 (ISO-8859-1で書かれた英語版のHTML)これによって、サーバはHTTPレスポンスヘッダに適切なCHARSETパラメタを含めるので、HTML中の <META> による指定は不要です。興味のある人は、ASAHI-Netをうろついたり、Content Negitiationを参考にしてください。
HTTPレスポンスヘッダにCHARSETパラメタが含まれている場合、この警告はチェックされません。
<META> に指定されている CHARSET `XXXX` は IANA に登録されていません。 **
![]()
インタネット上で使うさまざまなコードは、Internet Assigned Numbers Authority (IANA) という組織が管理しています。ここで指定する文字コード(CHARACTER SETS)も管理しています。
よく、"charset=x-sjis" や "charset=x-euc-jp" を見かけますが、これらは、IANAには登録されていません。しかし、WWWブラウザによっては、これらは解釈するけどIANAに登録されているやつは解釈しないというのもあります。Mozilla2.0などは、x-sjis は解釈するけれど Shift_JIS は解釈しません。これは、Shift_JIS の登録前に開発されたものだからです。日本語文書文字セットの指定方法などを参考にしてください。
登録前の文字セットの拡張として用いられる x-sjis、x-euc-jp などの x- で始まるものに関しては減点されません。
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="〜"> に CHARSET を指定するようにしましょう。 **
![]()
CHARSETの指定はなくてもいいのですが、RFC1945やRFC2068によると、指定しなかった場合は、ISO-8859-1が仮定されることになっています。日本語を書く場合はきちんと指定しなければなりません。
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="〜"> で CHARSET が指定されるより前に非ASCII文字が含まれています。 *5*
![]()
これは、RFC2070やHTML4.0に、もっとくどくど書かれていますが、ここでは単純にCHARSETが指定される前はASCIIしか書けない、と割り切ってしまっています。CHARSETで文字コードが指定されて始めて、そのリソースがどの文字コードで書かれているかわかるのです。<TITLE> で日本語を使っている場合は <META> よりも後ろに持って行ってください。
この警告は、<HEAD>〜</HEAD> 内のみのチェックです。HTMLがURLによる指定で、しかもHTTPレスポンスヘッダにCHARSETパラメタが含まれている場合は警告されません。
CHARSETで指定してあるコードが、US-ASCII、ISO-2022-JP のような 7bitコードのときに、非ASCIIコードが含まれていると警告されます。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
改行やタブ、JISのエスケープシーケンスなど以外の制御文字(0x00〜0x1F)が含まれているときに警告されます。ただし、NULコード(0x00=^@)はちょっと問題があって、HTTP経由でHTMLを取得した時点ですでにNULコードとそれに後続する一部のテキストが欠落してしまっていることがわかっています。つまり、NULコードは警告しようがありません。原因がどこにあるのかは調査していませんが、何か解決策やこちらの勘違い等のご指摘を歓迎いたします。
チェックをhtmllint.cgiでのゲートウェイ経由でなく、htmllintに直接ファイルを渡してチェックすれば、NULコードも警告されます。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
CHARSETにShiftJISが指定してあるときに、半角カタカナ(JIS X 0201 のカタカナ部分)が含まれていると警告されます。また、JISのときは ^[(I という半角カタカナ用のエスケープシーケンスが現れると警告されます。EUCでも半角カタカナが表現できますが、チェックしていません。^[(I というエスケープシーケンスは、ISO-2022-JPでは規定されていません。つまり、ISO-2022-JPと宣言しておいてこのエスケープシーケンスを用いるのは誤りです。
なぜ半角カタカナがだめなのかは、RFC1468や半角カナの危険性やなぜ半角カナは嫌われるのか(メモ)などを参考にしてください。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
特許出願用HTML、NTT DoCoMo iモードでは、半角カタカナの使用が許可されています。この場合、警告はされますが減点されません。
日本語のCHARSETが指定されているときや、CHARSETは指定されていないが日本語文書と判断されるとき、JIS X 0208:1997 で字形が例示されていない全角文字が含まれていると警告されます。例えば、丸付き数字やローマ数字、(株)などです。
JIS X 0208:1997 で字形が例示されているのは以下の区点コードです(かっこ内はJIS/SJIS)。
| 1-1 | (2121/8140) | 〜 | 2-14 | (222E/81AC) | |
| 2-26 | (223A/81B8) | 〜 | 2-33 | (2241/81BF) | |
| 2-42 | (224A/81C8) | 〜 | 2-48 | (2250/81CE) | |
| 2-60 | (225C/81DA) | 〜 | 2-74 | (226A/81E8) | |
| 2-82 | (2272/81F0) | 〜 | 2-89 | (2279/81F7) | |
| 2-94 | (227E/81FC) | ||||
| 3-16 | (2330/824F) | 〜 | 3-25 | (2339/8258) | 数字 |
| 3-33 | (2341/8260) | 〜 | 3-58 | (235A/8279) | ラテン大文字 |
| 3-65 | (2361/8281) | 〜 | 3-90 | (237A/829A) | ラテン小文字 |
| 4-1 | (2421/829F) | 〜 | 4-83 | (2473/82F1) | ひらがな |
| 5-1 | (2521/8340) | 〜 | 5-86 | (2576/8396) | カタカナ |
| 6-1 | (2621/839F) | 〜 | 6-24 | (2638/83B6) | ギリシア大文字 |
| 6-33 | (2641/83BF) | 〜 | 6-56 | (2658/83D6) | ギリシア小文字 |
| 7-1 | (2721/8440) | 〜 | 7-33 | (2741/8460) | キリール大文字 |
| 7-49 | (2751/8470) | 〜 | 7-81 | (2771/8491) | キリール小文字 |
| 8-1 | (2821/849F) | 〜 | 8-32 | (2840/84BE) | 罫線素片 |
| 16-1 | (3021/889F) | 〜 | 47-51 | (4F53/9872) | 第一水準漢字 |
| 48-1 | (5021/989F) | 〜 | 84-6 | (7426/EAA4) | 第二水準漢字 |
区点コード 1-1 〜 94-94 のうち、これら以外はすべて機種依存の文字とみなしています。
ここら辺の話については、情報交換用漢字符号系 JIS X 0208、日本語と文字コードや、使ってはいけない文字などを参考にしてください (注意: 84-5と84-6は、X 0208:1990 で追加されたので、X 0208:1983 を解説している文書には現われていません)。
特許出願用HTMLでは、丸付き数字の一部の使用が許可されています。この場合は警告されません。
指定されている CHARSET は `XXXX` ですが、実際のコードは YYYY です。 *5*
![]()
せっかくCHARSETで文字コードを指定してあるのに、実際には異なる文字コードでHTMLが記述されています。このような文書は、CHARSETを正しく解釈するWWWブラウザではまったく読むことができません。日本語の指定(JIS、EUC、Shift JIS)のみチェックしています。HTTPレスポンスヘッダ中にCHARSET指定がある場合は、そちらを優先します。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
HTTPレスポンスヘッダに指定されている CHARSET は `XXXX` ですが、<META> に指定されているのは `YYYY` です。 *5*
![]()
HTTPレスポンスヘッダでCHARSETがちゃんと指定されている場合、その指定と <META> で指定されているものが矛盾しています。日本語の指定(JIS、EUC、Shift JIS)のみチェックしています。
本来CHARSETの指定は、HTML中の <META> で明示するものではなく、HTTPレスポンスヘッダで行なわれるべきものなのですが、これはサーバ側で面倒をみなければならず、HTTPレスポンスヘッダにCHARSET指定を含めていないサーバは多数存在します。詳しくは「charsetパラメタの勧め: HTMLにおける文字符号化スキームの明示方法」を参照してください。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
<META> に指定されている CONTENT-TYPE が text/html ではありません。 *5*
![]()
text/html というのは、インタネットメディアタイプと呼ばれるインタネット上を流れるデータがいったいどんな種類のものかを表わす識別子で、これも IANA(Internet Assigned Numbers Authority) が管理しています。HTMLは text/html です。区切り文字のセミコロンを、誤ってコロンにしていたりするとこの警告が出ます。
<META HTTP-EQUIV="CONTENT-TYPE"> は NN行目にもありました。 **
![]()
誤りではないのかも知れませんが、一度にしておいた方が無難でしょう。HTTP-EQUIV="REFRESH" に対しても同様の警告が出ます。
<TAG> を使うときは <HEAD>〜</HEAD> 内に <META HTTP-EQUIV="CONTENT-XXXX-TYPE" CONTENT="〜"> を指定するようにしましょう。 *3*
![]()
HTML4.0には、スクリプトを使用する場合は <META> 内にベースとなるスクリプト言語を明示しておくように書かれています。
<META http-equiv="Content-Script-Type" content="text/javascript">
のように、<SCRIPT> が現れる前に宣言します。個々の <SCRIPT> に指定する言語は、必ずしもこれと同一である必要はありません。
また、スタイルシートを使用する場合も、ベースとなるスタイル言語を明示しておくように書かれています。
<META http-equiv="Content-Style-Type" content="text/css">
この警告は、<STYLE> タグに対する警告で、他のタグ中に埋め込む STYLE 属性に対してはもっと厳しい警告が出ます。ONCLICK 属性などに対しても同様です。
ATTR 属性を使うときは <HEAD>〜</HEAD> 内に <META HTTP-EQUIV="CONTENT-XXXX-TYPE" CONTENT="〜"> を指定しなければなりません。 *5*
![]()
スクリプトのイベント処理で利用する ONCLICK だとか ONBLUR だとかの属性を利用するときは、<META> で、そのスクリプト言語を指定しておかなければなりません。このことは、HTML4.0に明記されています。Javascriptならば、
<META http-equiv="Content-Script-Type" content="text/javascript">
というような宣言を含めておきます。
いろいろなタグの属性として埋め込まれる STYLE 属性を利用するときは、<META> で、そのスタイル言語を指定しておかなければなりません。このことは、HTML4.0に明記されています。CSSならば、
<META http-equiv="Content-Style-Type" content="text/css">
というような宣言を含めておきます。HTML4.0には、指定がない場合は text/css が採用されることが期待できるように書かれているのですが、指定しなくてもいいわけではありません。
<META HTTP-EQUIV="REFRESH"> を利用しての自動的なページ更新は避けましょう。 *3*
![]()
WAIでは、REFRESHによる自動的なページの更新は行なわないように書かれています。これは、利用者の意図が無視されているのが主な理由です。
<META HTTP-EQUIV="REFRESH" CONTENT="〜"> を利用するときは同等のリンクも用意しましょう。 *3*
![]()
自動書き換え機能をサポートしていないユーザエージェントのために、通常のリンクなどによって移動できるようにしておく必要があります。このことは、HTML4.0に記述されています。しかし、WAIでは、そもそもREFRESHによる自動的な方向付けを行なうことを推奨していません。
<SCRIPT>〜</SCRIPT> 内の要素はすべてコメントで囲んだ方が安全です。 **
![]()
<SCRIPT>〜</SCRIPT> 内には、JavaScript など、HTMLとは構文上無関係な構文のテキストが含まれます。<SCRIPT> タグを解釈しないWWWブラウザも多いため、もし何の工夫もしないと、JavaScript などのプログラムがそのまま表示されてしまいます。そこで、JavaScriptでは次のような書き方をします。
<SCRIPT type="text/javascript">
<!-- ここからスクリプトを見えなくする
JavaScriptステートメント...
// ここまで見えなくなる -->
</SCRIPT>
ここで、コメント末の --> がJavaScriptのコメント // の後ろにあることに気を付けてください。// を書かないで --> だけだと、-- がJavaScriptの演算子に解釈されて、構文エラーになってしまいます。JavaScriptの演算子 -- は、HTMLのコメント中でうまくない振る舞いをするかも知れませんが、おそらくWWWブラウザは、コメント中の -- をHTMLの仕様書とは違う実装で処理しているので大丈夫なのでしょう。HTML4.0では、コメント中に -- は書かないようにとされています。これは、このようなCDATA中の -- を考慮してのことかも知れません。
次のように書いても正しくコメントアウトされません。
<SCRIPT type="text/javascript">
//<!-- ここからスクリプトを見えなくする
JavaScriptステートメント...
// ここまで見えなくなる -->
</SCRIPT>
ちょっと考えれば最初の // が残ってしまうのがわかるでしょう。
スクリプトとしては、<!-- は、その行末までが無視されるので、次のようなことが可能だとしている参考書があります。
<SCRIPT type="text/javascript">
<!-- --> <H1>JavaScriptがサポートされていないよ</H1>
<!--
JavaScriptステートメント...
// -->
</SCRIPT>
<NOSCRIPT> はあとから追加されたので、古いWWWブラウザではサポートされていないことがあります。<NOSCRIPT> を使わなくても、<SCRIPT> 非対応のWWWブラウザのことを考慮できるということなんですが、"</" を <SCRIPT> 中に書くことはできないので、あまりたいしたことはできません。つまり、上の例は正しくありません。
同様に、Tcl、VBScript の場合は次のようにします。
<SCRIPT type="text/tcl">
<!-- ここからスクリプトを見えなくする
Tclステートメント...
# ここまで見えなくなる -->
</SCRIPT>
<SCRIPT type="text/vbscript">
<!-- ここからスクリプトを見えなくする
VBScriptステートメント...
' ここまで見えなくなる -->
</SCRIPT>
<STYLE>〜</STYLE> に対してもこのエラーが出ます。この場合は、単純に内容をすべてコメントで囲めばいいのです。
<STYLE type="text/css">
<!-- /* ここからスタイルを見えなくする */
スタイル記述ステートメント...
/* ここまで見えなくなる */ -->
</STYLE>
<SCRIPT>〜</SCRIPT> 内に `</` を直接書くことはできません。 *6*
![]()
SGML的には、<SCRIPT> や <STYLE> の内容の終わりは、</SCRIPT> や </STYLE> タグではありません。終了タグ開始記号 </ です (HTML4.0には </ にアルファベットが続くときなんて書かれてますが、本当ですか?)。したがって、JavaScriptなどで文字列として "</A>" というように "</" を含むものを直接記述することはできないことになっています。ではどうするかというと、何等かのエスケープ処理をしなければなりません。
"<EM>This will work</EM>" という文字列を考えてみましょう。JavaScriptの場合は次のようにします。
<SCRIPT type="text/javascript">
document.write ("<EM>This will work<\/EM>")
</SCRIPT>
Tclの場合は次のようにします。
<SCRIPT type="text/tcl">
document write "<EM>This will work<\/EM>"
</SCRIPT>
VBScriptの場合は次のように、Chr() 関数を使って対処します。
"<EM>This will work<" & Chr(47) & "EM>"
これらは、HTML4.0からの引用です。
要するに、とにかく "</" という列が現れなければいいので、JavaScriptでの
"<EM>This will work<"+"/EM>"
のようなやり方も有効です。
<SCRIPT> タグがありますが、<NOSCRIPT> タグがありません。 *4*
![]()
HTMLのヴァージョンによっては、<SCRIPT> に対して <NOSCRIPT> がない場合にこの警告が出ます。
この警告は、WAIで守らなければならない事柄とされています。<NOSCRIPT> はあとから追加されたので、Mozilla2.0などの一部の古いWWWブラウザでは <SCRIPT> はサポートするけども <NOSCRIPT> をサポートしていないことがあります。このようなときは、スクリプトが有効なときでも <NOSCRIPT> 内が表示されてしまうことに注意してください。
また、WAIに示されているのは、重要な情報や機能を持っているスクリプトに対して <NOSCRIPT> を用意しなさいということです。実際にはONCLICKなどの表示を伴わないイベント処理に使われることも多く、これに対する <NOSCRIPT> が必要かというと、必ずしもそうとは言えません。というわけで、この警告はWAIで必須とされているにもかかわらず減点されません。
<TITLE> の内容は半角換算で 64文字以内に収めるようにしましょう。 *3*
![]()
仕様上は文字数制限などないのですが、あまり長いタイトルはWWWブラウザによってちょん切られることがあるそうです。しかし、最低でも 64文字(半角換算)は可能なように、とのお達しがRFC1866にあります。HTML4.0にはこのような記述は見当たりません。
<BODY> での色指定が不完全です。XXX、YYY 属性も含めるようにしましょう。 **
![]()
多くのHTMLで、<BODY> で指定できる色の属性には、BGCOLOR、TEXT、LINK、VLINK、ALINK があります。MozillaなどのWWWブラウザでは、これらを無視して独自に指定できるものもあります。このとき、HTML中の指定が中途半端だと、WWWブラウザでの指定とが混在することがあります。例えば、<BODY bgcolor="white"> とだけ指定してある場合、WWWブラウザ側で黒地に白字なんて指定になっていると、そのHTMLがまったく読めないという事態に陥ります。このようなことを避けるため、色指定をする場合は、なるべく全部を指定するようにしましょう。
スタイルシート中で色指定している場合も似たようなことが起こり得るので注意してください。Another HTML-lint では、スタイルシートの内容まではチェックできません。
<BODY style="background: #FFFF00">
などとしている場合は、チェックできません。
<BODY> で BACKGROUND 属性を指定したときは BGCOLOR 属性も指定するようにしましょう。 **
![]()
<BODY> で背景画像を指定してあるとき、そこに書かれている文字はその背景画像上でうまく読めるように選ばれているはずです(意図的に背景に溶け込ませることもありますけど)。このとき、BGCOLOR属性を指定していないと、WWWブラウザが画像を表示しない設定などになっていると、その文字が読めなくなってしまう可能性があります。
<TAG> の ATTR 属性の色指定が <BODY BGCOLOR> の色と同じです。 *3*
![]()
例えば、
<BODY background="hogehoge.gif" bgcolor="#FFFFFF" text="#FFFFFF">
のような場合、背景画像の読込みでうまく文字が読めるようになるのでしょうが、背景画像を表示しない(できない)環境では、文字が全く読めなくなってしまいます(意図的に読めなくしていることもありますけど)。警告は、背景画像の指定とは無関係に行なわれます。また、
<BODY bgcolor="#FFFFFF">
<TABLE bgcolor="#FF0000">
<FONT color="#FFFFFF">
のような指定は、Mozilla2.0などでは読むことができません。
本当は、似た色もチェックしたいのですが、今のところチェックしていません(似た色の判定をどうすればいいのかよくわかっていないので:-)。
<TAG> の ID 属性の値 `XXXX` は NN行目ですでに使われています。 *5*
![]()
HTML2.xやHTML4.0で各タグに付けることのできるID属性は、ひとつのHTML中で重複した名前を付けることはできません。また、ID属性の値は、大文字小文字区別されません。
NN行目で参照されている <TAG> の ATTR 属性の ID `XXXX` は定義されていません。 *5*
![]()
HTML4.0での <LABEL> のFOR属性などの値は、他のタグのID属性として指定されていなければなりません。
<TAG> の NAME 属性の値 `XXXX` は NN行目ですでに使われています。 **
![]()
<FORM> の要素である <INPUT> や <TEXTAREA> などは、NAME属性で名前を付け、その設定情報をCGIなどに渡せるようになっています。チェックボックスやラジオボタンの組を除いて、同じ名前の要素がひとつのFORM内で複数存在すると、CGI側ではそれらを区別できません。
<TAG> に CHECKED 属性が指定されていますが、NN行目ですでに指定されています。 *5*
![]()
<INPUT type="radio"> で、同じ名前のラジオボタン、つまり同じグループのラジオボタンに付けられるチェックはひとつだけです。
<TAG> に SELECTED 属性が指定されていますが、NN行目ですでに指定されています。MM行目の <SELECT> に MULTIPLE 属性を指定してください。 *5*
![]()
<OPTION> に複数のSELECTED属性を付けるには、<SELECT> タグでMULTIPLE属性を指定しなければなりません。
NTT DoCoMo iモードでは、複数SELECTED属性を指定することはできません。
ひとつの <SELECT> 中に指定できる <OPTION> は 20件までです。 *5*
![]()
NTT DoCoMo iモードでは、<OPTION> による選択肢は20件までが指定可能です。
<OPTION> の VALUE 属性の値は半角換算で 10文字以内でなければなりません。 *5*
![]()
NTT DoCoMo iモードでは、<OPTION VALUE> の文字数は、半角で10文字以内でなければなりません。
<TAG> には初期値となるテキストを指定しておきましょう。 *3*
![]()
<INPUT type="text"> や <TEXTAREA> には、何か初期値となるようなテキストをあらかじめ書いておくことがWAIで薦められています。その理由に、空だと正しく処理できないWWWブラウザの可能性が示されています。
<BUTTON> に用いる <IMG> には USEMAP 属性を指定することはできません。 *5*
![]()
HTML4.0では、<BUTTON> にイメージを貼り付けるとき、それをイメージマップにすることはできないことになっています。
<TAGA> をここに書くことはできません。NN行目の <LABEL> 内には MM行目に <TAGB> が含まれています。 *5*
![]()
フォームコントロールをラベル付けするには何通りか方法がありますが、<LABEL> の要素にフォームコントロールを直接含めてしまうやり方があります。このとき、<LABEL>〜</LABEL> 内には、ひとつのコントロールしか含めることができません。HTML4.0を見てください。
FOR 属性の含まれない <LABEL>〜</LABEL> 内にはフォームコントロールを指定しなければなりません。 *5*
![]()
<LABEL> はフォームコントロールに付加属性を付けるためのもので、どれかひとつのフォームコントロールと関連付けられていなければなりません。その方法は、<LABEL> の要素に指定する方法と、FOR属性によってフォームコントロールのID属性と関連付ける方法があります。つまり、FOR属性のない <LABEL> は、要素の内容にフォームコントロールを含んでいなければなりません。
<TAG> の ID 属性の値と NN行目の <LABEL> の FOR 属性の値が食い違っています。 **
![]()
<LABEL> の要素にフォームコントロールを書いたとき、そのフォームコントロールはその <LABEL> に関連付けられることになっていますが、そこにさらにFOR属性やID属性を指定したときにどのように解釈されるのかについて、HTML4.0には言及がありません。
考えられる組み合わせは次のようになります。
<LABEL> <INPUT> </LABEL>
<LABEL for="A"> <INPUT> </LABEL>
<LABEL> <INPUT id="A"> </LABEL>
<LABEL for="A"> <INPUT id="A"> </LABEL>
<LABEL for="A"> <INPUT id="B"> </LABEL>
この解釈は間違っているかも知れません。ご指摘ください。
<TAG> には TABINDEX 属性を指定するようにしましょう。 *3*
![]()
アクセス性向上のために、フォームコントロールの <INPUT>、<TEXTAREA>、<BUTTON>、<SELECT> にはTABINDEX属性を付けて入力順序を指定するようにWAIで薦められています。この警告は減点されません。
WAIには、<A>、<AREA>、<OBJECT> にもTABINDEX属性を付けるように書かれていますが、ここでは除いています。
<TAG> には ACCESSKEY 属性を指定するようにしましょう。 *3*
![]()
アクセス性向上のために、<A>、<LABEL>、<LEGEND>、<AREA> などのリンク用のタグ、<INPUT>、<TEXTAREA>、<BUTTON> などのフォームコントロールには、ACCESSKEY属性を使って、キーボードショートカットを用意しておくことがWAIで薦められています (<A>に対しては別の警告が出ます)。この警告は減点されません。
<A accesskey="C" href="doc.html">XYZ company home page</A>
accesskey="XYZ" のように複数文字を指定することはできません。
指定するキーの一意性に関しては、HTML4.0には記述されていません。ユーザエージェントによっては、同じアクセスキーを持つコントロールは、それらの中で次々と移動するように実装されているようです。しかし、17.11.2には、<A> では直ちにリンク先に飛び、ラジオボタンの状態も直ちに変化する、ようなことが書かれています。これは、アクセスキーはアクションを起こすためのもので、コントロールの移動を行なうためのものではないということです。同じアクセスキーが指定された場合の議論がないのはどういうわけでしょうか。
ラベルと関連付けられているフォームコントロールでは、フォームコントロール自身にACCESSKEY属性がなくても、ラベルにあればいいことに注意してください。ラベルとフォームコントロールの関連付けの方法は、<LABEL> の要素としてフォームコントロールを書く方法と、<LABEL> のFOR属性とフォームコントロールのID属性で関連付ける方法があります。これについては別の警告のところに解説があります。
関連付けられたラベルとフォームコントロールにACCESSKEY属性を指定するときの組み合わせは次のようになります。
<LABEL> <INPUT>
<LABEL accesskey="A"> <INPUT>
<LABEL> <INPUT accesskey="A">
<LABEL accesskey="A"> <INPUT accesskey="A">
<LABEL accesskey="A"> <INPUT accesskey="B">
<TAG> には TITLE 属性を指定するようにしましょう。 *3*
![]()
アクセス性向上のために、<ABBR>、<ACRONYM> には、TITLE属性を書くようにWAIで薦められています。
この警告は減点されません。<FRAME> に関しては、書かなければならないとされていて、違う警告が出ます。
<TAG> には ALT 属性を指定するようにしましょう。 *4*
![]()
イメージが表示できないWWWブラウザも数多く存在します。また、表示ができるWWWブラウザでも、自動的にはイメージを読みに行かないような設定にしてあることもよくあります。そのようなとき、そこにどのようなイメージが貼り付けてあるのか、適切なコメントがあると、表示されたテキストがぐっと読み易くなります。どのようなコメントが適切かは多くの人がいろいろな意見を述べていますが、宗教色の濃い議論もあるので注意が必要です。ここでは、特に指針は示しませんが、空の指定 alt="" も、それなりに有効な場合があることだけは覚えておいてください。
<IMG> 以外でも、この警告は出ますが、ALT属性は徐々に必須属性になりつつあります。
<INPUT type="image"> はイメージのボタンを作ります。ところがこのタグにはALT属性がありませんでした。HTML4.0でようやくALT属性が指定できるようになりました。
この警告は、アクセス性向上のために、WAIで守らなければならない事柄とされています。
<TAG> には WIDTH と HEIGHT 属性を指定するようにしましょう。 *
![]()
イメージのサイズを指定しておくと、WWWブラウザが実際にそのイメージを読みに行かなくても、他のテキスト部分のレイアウトを行なうことができます。これは、ネットワークの負荷を軽減し、迅速な表示が行なえることを意味します。
<INPUT type="image"> はイメージのボタンを作ります。ところがこのタグにはWIDTHやHEIGHT属性がないので、どうしてもイメージの読み込みが起こります。HTML4.0にもありません。
プロバイダ指定の <IMG> を利用するアクセスカウンタCGIなどの中には、イメージの幅が特定できないものもあります。当然そのような場合にはWIDTHを指定することはできません。いや、指定してもいいですが、イメージがゆがむかも知れません。
<TABLE> には SUMMARY 属性を指定するようにしましょう。 *3*
![]()
アクセス性向上のために、<TABLE> には、SUMMARY属性を使って要約を付けておくことがWAIで薦められています。
<TH> には ABBR 属性を指定するようにしましょう。 *3*
![]()
アクセス性向上のために、<TH> には、ABBR属性を使ってヘッダラベルの省略形を付けておくことがWAIで薦められています。この警告は減点されません。
<TAGA> の COLSPAN 属性の指定と、NN行目の <TAGB> の ROWSPAN 属性の指定が重なり合っています。 *5*
![]()
<TABLE> のセルの構造で、COLSPAN属性とROWSPAN属性の指定に矛盾した部分があります。HTML4.0にある次の例を見てください。
<TABLE border="1">
<TR><TD>1 <TD>2 <TD>3
<TR><TD>4 <TD rowspan="2">5 <TD>6
<TR><TD colspan="2">7 <TD>9
</TABLE>
"5"のセルと"7"のセルが重なり合っています。
<FRAMESET> タグがありますが、<NOFRAMES> タグがありません。 *3*
![]()
フレーム機能をサポートしていないWWWブラウザも多いため、<NOFRAMES> を指定して、そういうWWWブラウザの便宜をはかってあげましょう。<NOFRAMES> を間違ったところに書いていたりスペルミスをしていないかもチェックしましょう。特に、<NOFRAME> と S が抜けていることが多いようです。
とはいえ、<NOFRAMES> があればいいというものでもありません。文法的には非の打ち所がないのですが、
<NOFRAMES>
<BODY>
<P>このページは Netscape で見て下さい。</P>
</BODY>
</NOFRAMES>
などというおばかなことはしないようにしましょう。
<FRAME> の SRC 属性に自分自身を指す URL `XXXX` を指定することはできません。 *5*
![]()
HTML4.0によると、<FRAME> の SRC 属性には、自分自身を指すURLを指定することは禁止されています。
<FRAME src="#same_document">
なんて書くことはできません。しかし、
<FRAME src="http://www.uso800.ac.jp/same_document.html">
のような場合は、Another HTML-lint はこれが自分と同じかどうかを判定できません。
<FRAME> には TITLE 属性を指定するようにしましょう。 *4*
![]()
アクセス性向上のために、<FRAME> には、TITLE属性を必ず書くようにとWAIに書かれています。
<TAG> の ATTR 属性のフレームターゲット名 `XXXX` は NN行目ですでに指定されています。 **
![]()
フレームターゲットに同じ名前を付けることはできません。でも、HTML4.0にそのことが書いてあるんでしょうか。
<TAG> の ATTR 属性のフレームターゲット名 `XXXX` は予約されています。 *3*
![]()
HTML4.0では、次のフレームターゲット名が予約されています。
このような名前を付けることはできません。というか、一般に付けられる名前の制限はもっときついです。次の警告を見てください。
<TAG> の ATTR 属性のフレームターゲット名 `XXXX` は正しくありません。 *3*
![]()
HTML4.0には、フレームターゲット名は英字から始まらなければならない、そうでない名前は無視される、と書かれています。これは、かなり厳しい制約で、将来増えるかも知れない(_topなどの)予約名に対処するためのものだと思われます。しかし、Mozillaなど、HTML4.0に先行してフレームを実装していたWWWブラウザではこのようなことはないようです。
<TAG> は物理的フォントタグです。論理的タグを使うようにしましょう。 *3*
![]()
文字フォント修飾のタグには、物理的なものと論理的なものがあります。物理的なものというのは、太字の <B> のように直接的なもので、論理的なものというのは、強調の <EM> という意味的なものです。SGMLの精神からは、なるたけ意味的な表現をするように心がけましょう、といったところなんですが、なかなかそうもいきませんね。WAIでも使わないように薦められています。この警告は減点されません。
顔文字などを <TT>:-)</TT> などと書くことも多いでしょう。このようなのはASCIIアートと呼ばれていて、WAIでは複数行に渡るようなASCIIアートは飛び越せるような工夫が必要とされています。
Laura Lemay のHTML本では、<B> が多用されています。
<P> は段落のためのタグです。改行するタグは <BR> です。 **
![]()
<P> を行末に書いているときにこの警告が出ます。<P> は改行するためのタグではありません。<P> を行末に書いていたのは、HTML2.0より前の大昔のことです。RFC1866では段落のためのタグとして、終了タグを伴って定義されています。
かなり多くの参考書が、<P> を改行するためのタグだとか、1行空けるためのタグだとか紹介しています。それは嘘です。そんなことを堂々と書くような著者は信用してはいけません。自分では調べもせず、間違いの書かれた二次文献や三次文献などからの引用で済ませているからだと思われます。
Lynxなどの一部のWWWブラウザは、連続する <BR> をひとつにまとめてしまうことがあります。この警告は、<BR> が3つ以上連続するときに警告されます。この警告は減点されません。
NN行目の <PRE> 内にはタブを書かないようにしましょう。 *3*
![]()
<PRE>〜</PRE> 内にタブ文字を書くことは避けるように、HTML4.0で強く要請されています。タブ文字は空白文字に置き換えられて表示されるのが普通ですが、モノによって期待通りの結果を得られないことがあるというのが理由です。つまり、<PRE> の整形済みという意図に反するということです。
<Hn> が NN行目の <Hm> に続いていますが好ましくありません。 *3*
![]()
HTMLには、章や節を直接表現する構造はありませんが、見出し用のタグ <H1>〜<H6> が用意されています。本来、これらの出現順序関係については、何の制約もありません。この警告は、<H2> の次に <H4> が来たら何かおかしいんじゃないの、という程度のものですが、このような使い方はRFC1866では推奨されていません。
また、これらを文字サイズ調整の意味に使っていたりするのを防ぐ効果も多少あります。多くの参考書が、<Hn> を文字サイズ調整のタグだと紹介しています。それは嘘です。ついでに、<Hn> は、ヘッダ(header)ではありません。見出し(heading)です。これも参考書がよく間違っています。
この警告は、アクセス性向上のために、WAIで守るべき事柄とされています。
<A> には ACCESSKEY 属性を指定するようにしましょう。 *3*
![]()
<INPUT>などに対する同様の警告を見てください。この警告は減点されません。
この警告は <A> に対するもので、他方はそれ以外に対するものです。<A> を別扱いしているのは、WAIでも「重要なリンクに対して
」というただし書きが付いているからで、全部の <A> に対してACCESSKEY属性を要求するものではないからです。
アクセス性向上のために、リンクとリンクの間は、何か印字可能な文字(空白でもよい)で区切ることがWAIで薦められています。例えば、
<A href="next.html">次</A><A href="prev.html">前</A>
ではなくて、
<A href="next.html">次</A>|<A href="prev.html">前</A>
とか
<A href="next.html">次</A>
<A href="prev.html">前</A>
のようにします。
リンクイメージの <IMG> の ALT 属性には何か説明を書きましょう。 *3*
![]()
リンクに使われているイメージで、次のようにALT属性が空のときに警告されます。
<A href="routes.html"><IMG src="topo.gif" alt=""></A>
このようなイメージには、WAIで何か等価な説明を書くようにとされています。
<A> のアンカーとして `ここ` などを使うのは好ましくありません。 *3*
![]()
例えば、目の不自由な方がページを読むとき、リンク部分だけを拾って読んだりすることがあるそうです。そのようなとき、
詳しくは<A href="detail.html">ここ</A>をクリックしてね
Click <A href="info.html">here</A> for more info.
とかいったリンクでは、意味がわかりません。もっと意味のある文章にしましょう。「ここ」だけじゃなくて「こっちのサイト」とか「このページ」とかいうのも引っかかります。一部の代表的なものしか引っかかりませんが、意図しないものも引っかかってしまうかも知れませんので、そのようなときはお知らせください。
なぜこのようなのがよくないかは、Laura Lemay のHTML入門や、Style Guide for online hypertext などに書いてあります。WAIでもこのような書き方は薦められていません。これは、HERE症候群と呼ばれています。
また、「クリック」というリンクもよくないとされています。なぜなら、リンクをたどる動作はクリックとは限らないからです。「押す」という用言も同様です。
<A> のアンカー名 `XXXX` 中に空白文字が含まれています。 *3*
![]()
アンカー名にはどんな文字を使ってもいいことになっているのですが、まあ、空白は使わない方がよかろう、ということです。アンカー名に安全でない文字を使った場合も参照してください。HTML4.0では、どんな文字でも使っていいわけではなくなりました。
<A> のアンカー名 `XXXX` 中に安全でない文字が含まれています。 *3*
![]()
アンカー名の扱いは微妙な問題をはらんでいます。アンカー名(fragment ID)の指定は、
<a name="foobar">
として行ないます。NAME属性の値には何を書いてもいいことに注意してください。一方、このアンカーを参照するには、
<a href="http://www.uso800.ac.jp/fake.html#foobar">
あるいは
<a href="#foobar">
のようにURIと一緒に指定します(RFC2396にはこのアンカー名はURIの一部ではないと明記されています)。一緒に指定するので、アンカー名にはURIとして正しくない文字は使ってはならないんですが、これは、NAME属性の性質と矛盾しています。URIとして使用できる文字だけで名前を付けているなら何の問題もありません。"[baz]" なんて名前を付けて、"[" や "]" が使えない文字だからといって、
<a href="#%5Bbaz%5D">
としてもうまくいきません。RFCでは、%XXエンコーディングが使えるようなことが書いてあるのですが、どうもうまくありません。仮にこのようにエンコードしての表現が正しいとしても、日本語などの名前を付けようと思ったら、とても悲惨なことになります。"はじめに" という名前をJISでエンコードすると
<a href="#%1B$B$O$8$a$K%1B(B">
なんてことになってわけがわかりません。そもそもJISを仮定していいわけがないしね。
というわけで、アンカー名には変な文字や、日本語なんかは使わない方が安全です。
"%" は、RFC2396では特に例外扱いされていませんが、RFC1738では、アンカー名に使うのは安全でないとされています。
HTML4.0では、アンカー名はASCII文字でなければならないと書いてあります。また、先々、NAME属性ではなくてID属性でアンカー名も指定させる方向にあります。
アンカー名を指定したつもりが
<a href="http://www.uso800.ac.jp/fake.html#">
となってるときに出る警告です。"#" の後ろの名前がありません。
<A> のアンカー名 `XXXX` は NN行目にもありました。 *5*
![]()
ひとつのHTML中で同じ名前を何個所にも付けることはできません。
<A name="girl">こばやしちよじ</A>
<A name="girl">きくちさよこ</A>
というのは正しくありません。次の警告も見てください。
<A> のアンカー名 `XXXX` は NN行目にもありました。大文字小文字は区別されない可能性があります。 *3*
![]()
HTML4.0では、アンカー名は大文字小文字の一致性を要求するものの、次のような例を不正だとしています。
<A name="xxx">...</A>
<A name="XXX">...</A>
ここではID属性については触れていません。ID属性の大文字小文字は、要素名や属性名などが区別されないのと同じ理由で区別されません(SGML宣言の NAMECASE GENERAL YES)。NAME属性の値自身は区別されるので、これらは別々のアンカーとして正当なのですが、NAME属性をやめてID属性にしようという思惑から、あえて指摘しているのだと思われます。
<A> のアンカー名 `XXXX` は NN行目で ID 属性としても指定されています。 *5*
![]()
HTML4.0では、<A name>で指定するアンカー名と、いろいろなタグのID属性の値は重複してはいけないことになっています。
<A href="#hakata">どげんした</A>
<A name="hakata">こげんした</A>
<H2 id="hakata">あげんした</H2>
というのは正しくありません。HTML4.0以外では警告されません。
<A> のアンカー名 `XXXX` は NN行目で ID 属性として定義されています。 **
![]()
HTML4.0では、
<A href="#hoeee">
に対応するアンカーを、ID属性で指定してもいいことになっています。というか、先々この方向にW3Cは持っていきたいようです。つまり、このリンクに
<H1 id="hoeee">
のようなのが対応してもいいのです。しかし、現在のWWWブラウザの実装ではこのような対応はあまり実現できていないようです。HTML4.0以外では警告されません。
<A> のアンカー名 `XXXX` が見つかりませんでした。 *3*
![]()
リンクを
<A href="#shit">
と書いたとき、このアンカーはそのHTML中に存在しなければならないのですが、これが見つからないときに警告されます。名前は大文字小文字が区別されるので注意してください。
<A> のアンカー名 `XXXX` は参照されていません。 *
![]()
指定されているアンカー名が同一のHTML中で参照されていないからといって、それが誤りとはいえません。ただ名前を付けているだけかも知れませんし、別のHTMLから参照されているかも知れないからです。しかし、名前の大文字小文字を間違っていたり、スペルミスなどがないとはいえません。この警告は減点されません。
つまり、
<IMG src="">
なんて書くのはちょっと、ということなんですが、RFC1808によると、URLが空の場合は <BASE> で指定されているURLと同じとみなすように書かれています。<BASE> がないときは自分自身と同じなので、そのとき
<A href="">
とした場合は、自分自身にリンクしていることになるのですが、Mozillaなどではそのような効果を期待することはできないようです。それどころか、JavaScriptとの組み合わせで、
<A href="" onClick="this.href=pickupRandomURL()" onMouseOver=...>
なんていうサンプルまであります。
<TAG> の ATTR 属性の URL `XXXX` 中に空白文字が含まれています。 *3*
![]()
URLに空白を含めることは禁止されていませんが、安全ではありません。URL中では空白は %20 として表現します。
<TAG> の ATTR 属性の URL `XXXX` 中に `\` が含まれています。パスの区切りは `/` でなければなりません。 **
![]()
URLではディレクトリ階層を示す区切りは "/" です。DOSなどの "\" は "/" に置き換えましょう。
<TAG> の ATTR 属性の URL `XXXX` 中に `~` が含まれています。%7E と書いた方が安全です。 *
1998年8月にRFC1738とRFC1808を統合してURIの一般構文を定めたRFC2396が標準化されました。これ以前は、URIとして ~ (チルダ) は安全でない文字とされていましたが、RFC2396では晴れて使える文字となりました。この ~ は、アカウント名のプレフィクスとして http://www.uso800.ac.jp/~k16/ のようによく使用されます。気になるなら、http://www.uso800.ac.jp/%7Ek16/ と書いた方がいいでしょう。
RFC2396でも、チルダは異なる文字(字形)として入力されることが多いのにもかかわらず、みんなが使うもんだからしょうがなく使えるようにしたことが窺がえます。実際、EUC-JPやShift_JISにも半角のチルダは含まれておらず、上線( ̄)となっています。
この警告は、以前のようにチェックできるようにするもので、減点されません。
<TAG> の ATTR 属性の URL `XXXX` 中に使用できない文字 `X` が含まれています。%XX と書かなければなりません。 *3*
![]()
一般の URI (Uniform Resource Identifier) は、RFC2396で規定されています。ASCII コード 20〜7E 以外の文字に対しては、別の警告が出ます。しかし、ASCII文字の中にも使用を除外されている文字がこのRFCに示されています。以下の文字が、除外されています。これらのうち、空白と \ は別の警告が出ますし、http: スキームのときは # はアンカー名の区切りに解釈されます。
| 空白 | %20 | |
" | %22 | |
# | %23 | |
% | %25 | |
< | %3C | |
> | %3E | |
[ | %5B | |
\ | %5C | |
] | %5D | |
^ | %5E | |
` | %60 | |
{ | %7B | |
| | %7C | |
} | %7D |
これらは、ASCIIコードを、右に示してある % に続く 2桁の 16進数(大文字でも小文字でも同じ)で表現します。
プロバイダ指定のCGIの中には | をそのまま書くように指定してあるものもあります。この場合、これを %7C にして動作しないのは、そのCGIが正しい仕様を守っていないからなので、諦めてください。
これらの文字は、RFC1738では安全でない(unsafe)とされていましたが、RFC2396では除外(excluded)とされています。
次のようなCGI呼び出しは、Muhammad A Muquit氏の WWW Homepage Access Counter and Clock です。
Count.cgi?df=hogehoge.dat|dd=A|frgb=FFFF00
この有名なアクセスカウンタは、区切りには | か & を指定できるので、& を指定した方がいいでしょう。このとき、HTML中では & と書きます (これについては不明な実体参照を参照のこと)。
Count.cgi?df=hogehoge.dat&dd=A&frgb=FFFF00
なお、このCGIの仕様書のキーワード一覧の degrees のところに、MSIEでは °rees が度文字に解釈されてしまって、これはMSIEのバグだ
、と書かれていますが、これはまったくの濡れ衣です。実体参照として ° がMSIEに限らずHTML4.0などで定義されていて、これを解釈するWWWブラウザなら度文字が表示されるかも知れないからです(細かいことを言えば、; がないので実体の終わりがわからず、適当に評価されるかも知れないということ)。&degrees と書かない方が悪いのです。さらに具合の悪いことに、degrees は危ないけど代替の angle なら安全だ、などと書かれていますが、∠ という実体参照も定義されているので、ちっとも安全ではありません。ついでに、ℑ、≠ という実体参照もキーワードと競合します。いずれにしても、パラメタ区切りを & のまま書くからいけないので、& と書けばどんな場合も安全です。
<TAG> の ATTR 属性の URL 中の実体参照 `&xx;` は使用できない文字 `X` です。 *3*
![]()
URI中に実体参照を用いて
<A href="<where>">
なんて書いても、これは "<where>" と書いたのと等価です。つまり、< や > などはURIに使えない文字なので、< や > などもURIには使えません。どうしても < や > などを書きたければ、
<A href="%3Cwhere%3E">
のようにします。&image のように、CGI呼び出し中の & に続くパラメタが、たまたま定義されている実体参照と同じだった場合にもこの警告が出ることがあります。CGI呼び出し中のパラメタ区切りは & と書くようにしましょう。
ÿ のような文字参照も同様です。このとき、含まれる # はアンカー名との区切り文字とはみなされません。
<TAG> の ATTR 属性の URL `XXXX` 中にASCII以外の文字が含まれています。 *5*
![]()
URLに使用できる文字は、ASCII コード 20〜7E の文字だけです。漢字やカタカナなどは使用できません。
<TAG> の ATTR 属性の URL に指定されているスキーム名 `XXXX` は正しくありません。 *5*
![]()
URLに指定できるスキーム名は、英小文字、数字、プラス "+"、ピリオド "."、ハイフン "-" から成る、とRFC2396に書いてあります。英大文字についてはそれを小文字とみなしてもよいとも書いてあります。この警告は、これらに違反したときに出ます。
<TAG> の ATTR 属性の URL のスキーム名 `XXXX` は小文字で指定しましょう。 **
![]()
URLに指定するスキーム名に使える文字には、本当は英大文字は含まれていませんが、RFC2396では、大文字を小文字とみなすような融通を利かしてもよいと書いてあります。
<TAG> の ATTR 属性の URL に不明のスキーム名 `XXXX` が指定されています。 **
![]()
URLに指定できるスキームに何があるのかをすべて把握しているわけではありません。いくつかのRFCにあるものなどを拾ってありますが、これらに含まれないスキーム名のときこの警告が出ます。もし、正しいのに警告されるときはお知らせください。でも、多くはスペルミスです。
RFC1738にあるのは以下のとおりです。
http:
ftp:
file:
gopher:
mailto:
news:
nntp:
telnet:
wais:
prospero:
また、セキュリティサーバのための https: などはRFCにはありませんし(たぶん)、HTMLで使って有意かどうかは別にして、他のRFCにもさまざまなスキームが定義されていますが、ここでの紹介は割愛します。
Mozillaなどでは、さらに
view-source:
javascript: / livescript: / mocha:
about:
montulli:
といったスキームも使用できます。これらのMozilla特有のスキームについては、Netscape Tips&Tricks などを見てください。
<TAG> の ATTR 属性の URL `XXXX` はインタネット上から参照できないかも知れません。 **
![]()
インタネット上に公開するHTML中のURLに、file: などのローカルファイルを指すスキームを指定しても、そのファイルを参照することはできません。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
<TAG> の ATTR 属性の URL `XXXX` はインタネット上に存在しないかアクセスできません。 **
![]()
指定されているURLが実際に存在するのかチェックしますが、処理の迅速化のためにタイムアウトの時間はかなり短く設定されています(変更可)。それでも、サーバの反応が遅いリンクが多い場合は時間がかかるでしょう。http: スキームのみチェックしています。ただし、正しくないURLのときはチェックしません。後に数字が付いている場合、それは、HTTPリクエストの結果のコードです。このコードは大きく分けて次のように分類されています。
| 100番台 | 通知 | ||
| 200番台 | 成功 | ||
| 300番台 | 移転 | ||
| 400番台 | クライアントエラー | ||
| 500番台 | サーバエラー |
これらのうち、このチェックで返ってくる可能性のあるコードでエラーとなるのは次のときです。
| 403 | アクセス権がない | ||
| 404 | ファイルが存在しない | ||
| 410 | サーバから削除された |
認証が必要なもの(401)などはそのリソースが存在することが明らかですし、サーバエラーのときは存在するのかしないのか不明なのでこのエラーは出ませんが、Another HTML-lint では文法チェックすることはできません。
HTTPのステータスコードに関して詳しくは、RFC1945、RFC2068などを見てください。
JavaScriptなどを利用して <BASE> を動的に変更していたりする場合は正しくチェックできません。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
<TAG> の ATTR 属性の URL `XXXX` は正しくない書式です。 *3*
![]()
URIの格好はRFC2396で決められていますが、これは総括的な一般URIの構文を規定しているだけで、個々のスキームごとの構文を規定しているわけではありません。ここでは、RFC1738などで決められている次のスキームについて個別のチェックを行ないます。このチェックに違反するとこの警告が出ます。
http://host[:port]/path[?query][#fragment-id]
ftp://[user[:passwd]@]host[:port]/path
file://[[user[:passwd]@]host[:port]]/path
gopher://host[:port][/type[selector[%09query[%09string]]]]
mailto:user@domain[?name=value]
news:[article@]domain
nntp://host[:port]/newsgroup[/article]
telnet://[user[:passwd]@]host[:port][/]
wais://host[:port]/[database]
prospero://host[:port]/path[field]
ただし、上記構文はかなり端折ってあり、正確ではありません。本当はそれぞれもっといろいろな書き方があります。正確な構文等を知りたいときは以下を参照してください。ただし、Another HTML-lint ではRFC1738以外が必ずしも反映されているわけではありません。また、RFC2396には、これらの修正情報があります。
個々のスキームごとに使用できる文字が微妙に異なっていますが、URIで表記するときにRFC2396で禁じられている文字を、直接書いたり実体参照などを用いて表現したりすることはできません。このような文字は、すべて %3C のように表現しなければなりません。
いくつか間違った例を示しましょう。
http:~k16/hogehoge.htmlhttp:/~k16/hogehoge.html
http: などのスキーム名を付けることはできません。http: は付けないようにします。
http://.uso800.ac.jp/~k16/hogehoge.html
. から始まることはありません。
http://fake_univ.uso800.ac.jp/~k16/hogehoge.html
http://bogus-.uso800.ac.jp/~k16/hogehoge.html
http://geregere:password@uso800.ac.jp/~k16/hogehoge.html
http: にユーザIDやパスワードを含めることはできないことになっています。しかし、多くのHTTPサーバはこれを受け付けています。安全のためには、URI中に素のパスワードなどは書かないようにしましょう。ftp: などには構文上含められます。
http://www.uso800.ac.jp/cgi-bin/hogehoge.cgi?foo=bar|zoo=penguin
| が用いられています。| はURIに使えない文字なので %7C と表記しなければならないのですが、残念ながら、そうすると動作しないCGIが多数存在します。Muquit氏のアクセスカウンタ (Count.cgi) に関してURIに使えない文字の解説を見てください。
file://c:/homepage/index.htmlfile://c:\homepage\index.html
localhost とするか空にする必要があります。また、WindowsやDOSのディレクトリ区切り \ は使えないので / に置き換えます。Macintoshのディレクトリ区切り : も / に置き換えます。file://localhost/c:/homepage/index.html
file:///c:/homepage/index.html
: を | に置き換えることもあるようです(これの出典はどこですか?お教えください)。しかし | はURIに使えない文字なので %7C と表記します。
file:///c%7C/homepage/index.html
mailto:geregere.uso800.ac.jp
@ です。
mailto:geregere@uso800.ac.jp
mailto: geregere@uso800.ac.jp
mailto:geregere@uso800.ac.jp
mailto:geregere@uso800.ac.jp,bianca@bogus.ac.jp
mailto:Killer Panther <geregere@uso800.ac.jp>
mailto: にはメールアドレス以外の情報を書くことはできないことになっていますが、他の(http:などの)スキームと異なり、直ちにこのURLによってメールが送信されたりすることはありません。WWWブラウザがこのURLの情報を解釈してメーラに渡し、メーラを利用者が操作して(本文などを書いてから)メールを送信することになります。このため、mailto: URLの書式にはかなり自由度のある実装がされていると思われます。メーラと連動しているWWWブラウザにはそれらを解釈できるものもあるようです。> があるので、<A> タグなどがそこで閉じられてしまい、警告中には > は出てきません。mailto:"Killer Panther "<geregere@uso800.ac.jp>
"、<、> などをURI中に書くことは禁じられているので、
mailto:%22Killer%20Panther%20%22%3Cgeregere@uso800.ac.jp%3E
mailto:geregere@uso800.ac.jp
news://news.uso800.ac.jp/uso800.www.authoring
nntp: の構文です。多くのユーザエージェントはこれを news: として受け入れているようです。現在のRFC的には news: として正しい構文とはいえませんが、許容される方向にあるようです。
news:123/news.uso800.ac.jp
/ は含まれません。これはきっと news:123@news.uso800.ac.jp の間違いです。
news:123@.news.uso800.ac.jpnews:uso800@192.168.0.1
RFC2368によって、mailto:geregere@uso800.ac.jp?subject=hello のような書き方が許されるようになりました。覚え書きを見てください。
また、本来の目的とは無関係に、mailto: などの後ろに文章を書くという裏技(?)が存在するようです。これは、Mozillaなどでマウスを持って行くとステータスラインにその文章が表示されるという効果を狙ったものだと思われます。
<TAG> の ATTR 属性の URL `XXXX` は `/` で終わらせるようにしましょう。 **
![]()
URLで指定できるスキームには、http、ftp、mailto などいろいろありますが、http/https スキームについてだけ調べています。http スキームのURLは、
http://host:port/path
みたいな構文です。多くのサーバでは、デフォルトHTMLは省略できるので、
http://www.uso800.ac.jp/fake/index.html
を
http://www.uso800.ac.jp/fake/
と省略することができます(デフォルトHTMLがindex.htmlの場合)。これを
http://www.uso800.ac.jp/fake
と書いてしまうと、fake というファイルを探しに行ってみたら、実はそれはディレクトリだった、ということで、改めて index.html なりを探しに行くので、むだが多く、好ましくありません。だから、ディレクトリを示すURLには "/" を付けなければなりません。しかし、実際にそのURLが存在するかどうかは、(指定されたとき以外は)Another HTML-lintでは調べていないので、このような場合の警告を出すことができません。ここでは
http://www.uso800.ac.jp/~k16
http://www.uso800.ac.jp/%7Ek16
というような場合にだけ警告が出ます。アカウント名のプレフィクスは、指定で ~ 以外にもなるんだけど、まあ、多くは ~ だろうということです。
URLが存在するかどうかチェックしているときには、実際に "/" が必要かどうかがチェックされることがあります。現在はURL取得の方法にLWPを使った環境でのみ可能です。
また、
http://www.uso800.ac.jp
というのは誤りではありません。このホスト名の指定だけの場合は "/" を省略してもいいことになっています(RFC1738、RFC1808)。
<TAG> の ATTR 属性の URL `XXXX` は NN行目で `YYYY` と指定されています。 *
![]()
例えば、
http://www.uso800.ac.jp/bogus/
というURLと、
http://www.uso800.ac.jp/bogus
というURLが指定されている場合、"/" のある方とない方とどちらかが間違いなのが明白です。この警告はこのようなとき出ます。http/https スキームについてだけ調べています。
なーんて、浅知恵で考えていましたが、実際には "/" のありなしでまったく異なるリソースを指すことが可能です。例えば、
http://www.perl.com/CPAN/ http://www.perl.com/CPAN
とは言っても、そのような設定をされているサーバがそんなに多いとも思えないので、この警告自身は残しておきますが、減点されません。
<TAG> の ATTR 属性の URL `XXXX` は NN行目で `YYYY` と指定されています。 *
![]()
index.html の多くはデフォルトHTMLであろう、という仮定で、同一HTML中に
http://www.uso800.ac.jp/fake/index.html
と
http://www.uso800.ac.jp/fake/
などが混在しているときに警告されます。WWWブラウザは、これらが同じリソースかどうかを判断できないので、別々にキャッシュしてしまい、効率的でありません。http/https スキームについてだけ調べています。
また、こんなことはしないとは思いますが、
http://www.uso800.ac.jp/bogus/fake/../index.html
と
http://www.uso800.ac.jp/bogus/index.html
は同じリソースを指すことに注意してください。と思っていたら、存外にすることがあるようです。
<BASE> の HREF 属性で指定するより前に NN行目で URL が指定されています。 *5*
![]()
<BASE> でHREF属性を指定するときは、それより前に外部との関連付けを行なってはなりません。HTML4.0では、このように一切の参照を制限しています。HTMLかどうかなど、リソースの種類についての限定は行なっていないことに注意してください。
<LINK rev="MADE" href="mailto:k16@chiba.email.ne.jp">
<BASE href="http://www.uso800.ac.jp/bogus/fake/">
のようなのもだめです。<BASE> は、なるべく <HEAD> 要素の最初の方に書くようにしましょう。
<BASE> の HREF 属性の URL は絶対位置で指定しなければなりません。 *5*
![]()
<BASE> のHREF属性で指定するURIは、絶対指定でなければならないことが、HTML4.0に書かれています。つまり、
<BASE href="base.html">
などとすることはできません。
<BASE href="http://www.uso800.ac.jp/bogus/fake/base.html">
のようにする必要があります。
HTMLは </HTML> が現れたらおしまいです。WWWブラウザによっては </HTML> の後も表示しますが、そんなのを期待してはいけません。
XXXXXX では、HTML文書は 2Kバイト以内でなければなりません。 *5*
![]()
NTT DoCoMo の iモード用のHTML文書は2Kバイト以内に収めなければなりません。この2Kバイトには、ページ中で使用されているイメージファイルのサイズも含まれるのですが、通常はそこまでは加算されません。URLが存在するかどうかチェックしているときには加算されます。
<IMG> の SRC 属性の URL `XXXX` が GIF ではありません。 *5*
![]()
NTT DoCoMo の iモード用のHTML文書に利用できるイメージは、2階調GIFのみですが、調べたGIFが2階調かどうかはチェックされません。
この警告は、URLが存在するかどうかチェックしているときのみ有効です。
XXXXXX は <HTML> から始まらなければなりません。 *5*
![]()
変な決まりですが、特許出願用文書の先頭は <HTML> でなければなりません。覚え書きを見てください。
XXXXXX は Shift JIS で記述しなければなりません。 *5*
![]()
特許出願用文書は Shift JIS で書かなければならない決まりです。覚え書きを見てください。また、NTT DoCoMo の iモード 用のときも Shift JIS で書かなければなりません。覚え書きを見てください。
HTMLをURLでなく、DATA領域に指定した場合は、このエラーはチェックされません。
XXXXXX では `■` を使うことはできません。 *5*
![]()
特許出願用HTMLに使える文字については、くどくどいろいろ細かい決まりがあるのですが、とりあえず、利用者使用禁止となっている文字だけチェックしています。また、使える文字として半角カタカナや、丸付き数字の一部などが追加されています。覚え書きを見てください。
このサイトの運営は作者が行なっているわけではありませんのでご注意ください。作者が管理しているのはプライマリサイトだけです。