[2] HTML 4 は、次を[DFN[[RUBYB[[[空白]]] [white space]]文字]]としています。 - [[ASCII]] [[間隔]] ([CODE(char)[U+0020]] [CODE(char)[[[SPACE]]]])) - ASCII [[タブ]] ([CODE(char)[U+0009]] [CODE(char)[HORIZONTAL TAB]]) - ASCII [[改頁]] ([[書式送り]]) ([CODE(char)[U+000C]] [CODE(char)[FORM FEED]]) - [[零幅間隔]] ([CODE(char)[U+200C]] [CODE(char)[ZERO-WIDTH SPACE]]) - [RUBYB[[[改行]]] [line break]] -- [[復帰]] ([CODE(char)[U+000D]] [CODE(char)[CARRIAGE RETURN]]) -- 改行 ([[行送り]]) ([CODE(char)[U+000A]] [CODE(char)[LINE FEED]]) -- 復帰改行組 ([CODE(char)[[[CRLF]]]]) です。 HTML 4 の[[文書文字集合]]には他にも定義によっては空白文字に属する[[文字]]が色々含まれていますが、 HTML 4 の空白は上記だけです。 HTML 4 仕様書は、他の種類の空白の扱いについては規定せず、 [[著者]]は空白制御のためには適切な[[要素]]や[[スタイル]]を使うべき (should) としています。 [3] [CODE(HTMLe)[[[pre]]]] 以外の HTML 要素では、 空白が「[DFN[語]]」を分離します。 (ここで、語とは、非空白文字の連続体のことです。) [[UA]] は、[[書式付け]]に際して、その[[言語]]・[[用字系]]および対象[[媒体]]の慣習に従って語を識別し、これを配置するべきです (should)。 語間に間隔 ([DFN[[RUBYB[語間] [inter-word]]間隔]]) を挿入すると見た目が向上するかもしれません。 しかし、間隔の取り方に関する慣習は言語・用字系により種々です。 HTML 4 仕様書が挙げている例では、 - [[ラテン文字]]では間隔を挿入する - [[タイ文字]]では零幅間隔を挿入する -- 注: [[タイ語]]は、日本語や中文のように語間間隔を入れずに表記します。 だけど零幅間隔を使えば単語境界を機械的に識別できるじゃん! という文脈でよく例になります。 (しかしながら、 [[TIS620]] には零幅間隔はないと思うし、本当に使われているんだか。) - [[日本語]]や[[中文]]では全く語間間隔を表示しない [[原始文書]]中の空白列は、全く異なって[[レンダリング]]されるかもしれないことに注意が必要です。 UA は、原始文書中の空白列をレンダリングするときにはまとめて1つ分の語間間隔にするべきです。 これは、自然言語情報 ([CODE(HTMLa)[[[lang]]]] 属性や上位プロトコルからの値) が得られないときでも行うことができ、また行うべき (can & should) とされています。 空白が重要なときには、 [CODE(HTMLe)[pre]] 要素型を使います。 [4] [[SGML]] の規定や既存 UA 実装の問題から、 [[開始タグ]]直後や[[終了タグ]]直前の空白が表示されることを当てにするべきではありません (should not)。 たとえば、 [SAMP(HTML)[I love you.]] を [SAMP(HTML)[I love you.]] と書いてしまうと、 意図とは異なることが多いでしょう。 SGML の問題は、[[記録開始]]や[[記録終了]]の無視に関する規則のことで、 [[タグ]]の前後に改行があるときに注意が必要です。 詳しくは [CODE(SGML)[[[SGML//空白]]]]を参照。 [[#comment]] * FORM FEED [5] HTML 4 は、 >>2 の通り、 [CODE(char)[U+000C]] [CODE(char)[FORM FEED]] ([[改頁]]) を空白の一種としています。 ところが、 HTML 4 の [[SGML宣言]] は、 [CODE(char)[U+000C]] を [CODE(SGML)[[[UNUSED]]]] としています。もちろん [CODE(SGML)[[[s]]]] にも含まれません。 SGML 宣言を信じるとすると、 [CODE(char)[U+000C]] は HTML 4 では使用できず、 >>2 の規定は無駄になります。 [6] ''XHTML 1.0 C.15. White Space Characters in HTML vs. XML'' は、 HTML では [CODE(char)[U+000C]] を使えるが、 XHTML では使えないと言っています。 [7] 本文が正しく、 [CODE(char)[U+000C]] が使えたとしても、 [CODE(SGML)[s]] には含まれないので、 HTML 文書の本文では >>2 の通りの扱いを受けますが、 SGML 的には空白として使えません (例えば[[属性指定]]の間には使えません)。 [[#comment]] * ZWSP [8] [CODE(char)[U+200C]] [CODE(char)[ZERO-WIDTH SPACE]] は >>2 の通り HTML で空白として扱われます。 しかし、 SGML 宣言によれば、 [CODE(SGML)[s]] には含まれません。ですから、 HTML 文書の本文では >>2 の通りの扱いを受けますが、 SGML 的には空白として使えません (例えば属性指定の間には使えません)。 [[#comment]] * タグ前後の空白 [9] SGML の規定により、[[開始タグ]]直後と[[終了タグ]]直前の改行は全要素 ([CODE(HTMLe)[[[pre]]]] や [CODE(HTMLe)[[[textarea]]]] を含みます。) で例外なく無視されます。 HTML 4 [CITE[B.3.1 Line breaks]] 例 [SRC[HTML 4 B.3.1]]: 次の2段落は同じ内容です。 [PRE(HTML)[

Thomas is watching TV.

Thomas is watching TV.

]PRE] なお、 [[XHTML]] ではこの規定は適用されません。2つ目の段落の内容は改行を含みます。 詳しくは [[SGML//空白]]をご覧下さい。 [10] >>9 HTML 4 附属書 B (参考) には[Q[すべての要素で例外なく]]なんて書いてありますが、 実際には[[強制空要素]]が例外になりますし、要素が [[DTD]] の[[添加要素指定]]に該当するか否かや改行が [CODE(char)[[[CR]]]] か [CODE(char)[[[LF]]]] か両方かその他かで細かいところが変わってきます。 (その他なら無視されません。) (XHTML はやっぱりこの問題はありません。 [[XML]] では実体を読んだら最初に改行を正規化してしまいますから。) ([[名無しさん]]) [[#comment]] * メモ [11] [CITE[Re: HTML での 空白の扱いについて]] , ([[名無しさん]] [sage]) [12] [[XHTML 1.0]] では、 [[XML 1.0]] に従った [[XML]] としての処理の後、 [[CSS 2.0]] によって処理すると規定しています。 ただし、 [[CSS 2.0]] は[[ラテン文字]]以外に関する規定がないので将来この部分は修正されるかもしれないとされています。 仕様書: - [[XHTML 1.0]] -- [CSECTION[3.2. User Agent Conformance]] ([[名無しさん]] [sage]) [13] XHTML 1.0 での予告通り(?) [[XHTML m12n]] では説明が細かくなっています。 - [[XHTML m12n]] -- [CSECTION[3.5. XHTML Family User Agent Conformance]] ([[名無しさん]] [sage]) [14] >>12-13 正確には、 [[XHTML 1.0]] [[FE]] であった [CODE(XMLa)[xml:space]] の部分が [[XHTML m12n]] には引き継がれてますが、 [[XHTML 1.0]] [[SE]] ではカットされていますね。 ([[名無しさん]] [sage])