[18] HTML 3.2 仕様書では、タグの前後の改行の処理に関する SGML の空白の規則を特に紹介しています。
[19] また、 pre
要素内を除き、
複数の空白は1つの SPACE
にまとめると規定されています。
ただし、空白
の定義はありません。
[20] ちなみに、SGML宣言では RS
と RE
(LINE FEED
と CARRIAGE RETURN
) と
SPACE
(SPACE
) の他、
SEPCHAR
の TAB
として
HORIZONTAL TABULATOR
が機能文字として宣言されています。
この4文字が空白ということでよいのでしょうか。
[21] なお、将来の版ではタブの幅がスタイル・シートで制御できるようになるかもしれないと予告されています。 (が、 CSS 2.1 までではまだ実現していません。。。)
[22] 仕様書:
[2] HTML 4 <IW:HTML4:"struct/text.html#whitespace"> は、次を空白文字としています。
U+0020
SPACE
))U+0009
HORIZONTAL TAB
)U+000C
FORM FEED
)U+200C
ZERO-WIDTH SPACE
)です。 HTML 4 の文書文字集合には他にも定義によっては空白文字に属する文字が色々含まれていますが、 HTML 4 の空白は上記だけです。 HTML 4 仕様書は、他の種類の空白の扱いについては規定せず、 著者は空白制御のためには適切な要素やスタイルを使うべき (should) としています。
[3] pre
以外の HTML 要素では、
空白が「語」を分離します。
(ここで、語とは、非空白文字の連続体のことです。)
UA は、書式付けに際して、その言語・用字系および対象媒体の慣習に従って語を識別し、これを配置するべきです
(should)。
語間に間隔 (語間間隔) を挿入すると見た目が向上するかもしれません。 しかし、間隔の取り方に関する慣習は言語・用字系により種々です。 HTML 4 仕様書が挙げている例では、
原始文書中の空白列は、全く異なってレンダリングされるかもしれないことに注意が必要です。
UA は、原始文書中の空白列をレンダリングするときにはまとめて1つ分の語間間隔にするべきです。
これは、自然言語情報 (lang
属性や上位プロトコルからの値)
が得られないときでも行うことができ、また行うべき
(can & should) とされています。
空白が重要なときには、 pre
要素型を使います。
[4] SGML の規定や既存 UA 実装の問題から、 開始タグ直後や終了タグ直前の空白が表示されることを当てにするべきではありません (should not)。
たとえば、 I <a>love</a> you. を I<a> love </a>you. と書いてしまうと、 意図とは異なることが多いでしょう。
SGML の問題は、記録開始や記録終了の無視に関する規則のことで、
タグの前後に改行があるときに注意が必要です。
詳しくは SGML//空白
を参照。
[15] 適合 XHTML族利用者エージェントは次の規則に従って空白を処理しなければなりません XHTML m12n 1.0 FE 3.5。
S
と同じ4文字です。[17] XHTML m12n には LINE FEED
の変換方法に関する参考として次の内容の注記があります。
LINE FEED
の前後の文字の用字系が同じであり、
SPACE
が語分離子として使われるものであるなら、
SPACE
に変換するべきです。
(ラテン文字、ギリシャ文字、キリル文字など)LINE FEED
の前後の文字の用字系が表意文字系や語分離子を使わない書字方法なら、
除去するべきです。 (中文、日本語など)LINE FEED
の前後の文字の用字系が非表意文字系で語分離子を使わないものなら、
ZERO-WIDTH SPACE
に変換するか、
または除去するべきです。LINE FEED
は SPACE
に変換するべきです。なお、 COMMON
用字系 (句読点など)
はもう一方の側と同じ用字系と考えます。
文字の属する用字系の名前は UTR #24 にあります。
[16] 仕様書:
[32] 適合RDFa処理器の項になぜか著者に対するアドバイスがあります。
[5] HTML 4 は、 >>2 の通り、 U+000C
FORM FEED
(改頁) を空白の一種としています。
ところが、 HTML 4 の SGML宣言
<http://www.w3.org/TR/html4/sgml/sgmldecl.html>
は、 U+000C
を UNUSED
としています。もちろん s
にも含まれません。
SGML 宣言を信じるとすると、 U+000C
は HTML 4 では使用できず、 >>2 の規定は無駄になります。
[6] XHTML 1.0 C.15. White Space Characters in HTML vs. XML <http://www.w3.org/TR/xhtml1/#C_15>
は、 HTML では U+000C
を使えるが、 XHTML では使えないと言っています。
[7] 本文が正しく、 U+000C
が使えたとしても、
s
には含まれないので、 HTML 文書の本文では >>2
の通りの扱いを受けますが、 SGML 的には空白として使えません
(例えば属性指定の間には使えません)。
[35] U+000B
は、一時期 HTML5 で space characters に含まれていましたが、
CSS 等との整合性のため削除されました。
[8] U+200C
ZERO-WIDTH SPACE
は >>2 の通り HTML で空白として扱われます。
しかし、 SGML 宣言によれば、 s
には含まれません。ですから、 HTML 文書の本文では >>2
の通りの扱いを受けますが、 SGML 的には空白として使えません
(例えば属性指定の間には使えません)。
[9] SGML の規定により、開始タグ直後と終了タグ直前の改行は全要素
(pre
や textarea
を含みます。)
で例外なく無視されます。
HTML 4 B.3.1 Line breaks <IW:HTML4:"appendix/notes.html#notes-line-breaks">
例 HTML 4 B.3.1: 次の2段落は同じ内容です。
<P>Thomas is watching TV.</P> <P> Thomas is watching TV. </P>
なお、 XHTML ではこの規定は適用されません。2つ目の段落の内容は改行を含みます。
詳しくは SGML//空白をご覧下さい。
[10]
>>9 HTML 4 附属書 B (参考) にはすべての要素で例外なく
なんて書いてありますが、
実際には強制空要素が例外になりますし、要素が DTD の添加要素指定に該当するか否かや改行が
CR
か LF
か両方かその他かで細かいところが変わってきます。
(その他なら無視されません。)
(XHTML はやっぱりこの問題はありません。 XML では実体を読んだら最初に改行を正規化してしまいますから。) (名無しさん)
[26]
Live DOM Viewer (2008-05-03 12:45:29 +09:00
版) <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cstyle%3Epre%20%7Bborder%3A%201px%20blue%20dotted%7D%3C%2Fstyle%3E%0A%3Cpre%3E%0Axxx%3C%2Fpre%3E%0A%3Cpre%3E%26%23xa%3Bxxx%3C%2Fpre%3E%0A>
pre
要素先頭が数値文字参照となった改行であるとき、その改行は無視されるのか?
(名無しさん)
[27]
Live DOM Viewer (2008-05-03 12:50:00 +09:00
版) <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ctextarea%3E%0D%0Axxx%3C%2Ftextarea%3E%0D%0A%3Ctextarea%3E%26%23xa%3Bxxx%3C%2Ftextarea%3E%0D%0A>
>>26 と同じく、 textarea
要素の場合、
Firefox 2 と Opera 9.27 でも無視されます。
(名無しさん)
[11] Re: HTML での 空白の扱いについて <http://groups.google.com/groups?selm=cb68cm%24bte%241%40news.sfc.keio.ac.jp>, <mid:cb68cm$bte$1@news.sfc.keio.ac.jp>
(名無しさん [sage])
[12] XHTML 1.0 では、 XML 1.0 に従った XML としての処理の後、 CSS 2.0 によって処理すると規定しています。 ただし、 CSS 2.0 はラテン文字以外に関する規定がないので将来この部分は修正されるかもしれないとされています。
仕様書:
(名無しさん [sage])
[13] XHTML 1.0 での予告通り(?) XHTML m12n では説明が細かくなっています。
(名無しさん [sage])
[14]
>>12-13
正確には、 XHTML 1.0 FE であった
xml:space
の部分が
XHTML m12n には引き継がれてますが、
XHTML 1.0 SE ではカットされていますね。
(名無しさん [sage])
[23] Line Mode Browser 1.2a (1992年2月?) は、バグの修正として、 空白 (表示上の?) の後に続く改行は無視するようにした、 とあります。この修正によって段落のタグの後に改行があっても余分な空白が表示されなくなるそうです。
(名無しさん [sage])
[24]
Article 3507 at 02/12/03 10:45:07 From: shim@d5.bs1.fc.nec.co.jp Subject: [w3m-dev 03507] save space in JP chars (2002-12-03 10:46:24 +09:00
版) <http://www.sic.med.tohoku.ac.jp/~satodai/w3m-dev/200212.month/3507.html>
(名無しさん 2007-05-17 11:50:50 +00:00)
[25]
[w3m-dev 04238] [patch] simple preserve space ( 著, 2007-05-15 02:45:54 +09:00
版) <http://permalink.gmane.org/gmane.comp.web.w3m.devel/905>
(名無しさん 2007-05-17 11:54:17 +00:00)
[29]
[emacs-w3m:10278] Re: w3m eats spaces (Katsumi Yamaoka 著, 2008-07-02 04:00:13 +09:00
版) <http://permalink.gmane.org/gmane.emacs.w3m/7639>
(名無しさん)
[30] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E%0A%3Cbody%3E%0A%3Cscript%3E%0A%20%20document.write%20(%22%3Cp%3Ex%22)%3B%0A%20%20document.write%20(%22%5Cu000D%22)%3B%0A%20%20document.write%20(%22%5Cu000A%22)%3B%0A%20%20document.write%20(%22%3C%2Fp%3E%22)%3B%0A%20%20w%20(encodeURIComponent%20(document.getElementsByTagName%20(%27p%27)%5B0%5D.firstChild.data))%3B%0A%3C%2Fscript%3E%0A>
Firefox 3、Safari 3.1 では CRLF が LF だけになる (使用通り)。 Opera 9 では改行の正規化は行われていないけど、 この例だけでなく、分断されていない場合であってもそうなる模様。
(名無しさん)
[31]
>>30 をちょっと変えて <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C!DOCTYPE%20html%3E%0A%3Cbody%3E%0A%3Cscript%3E%0A%20%20document.write%20(%22%3Cp%3Ex%22)%3B%0A%20%20document.write%20(%22%5Cu000D%22)%3B%0A%20%20w%20(encodeURIComponent%20(document.getElementsByTagName%20(%27p%27)%5B0%5D.firstChild.data))%3B%0A%20%20document.write%20(%22%5Cu000A%22)%3B%0A%20%20document.write%20(%22%3C%2Fp%3E%22)%3B%0A%3C%2Fscript%3E%0A> にしたらどうなるか?
(U+000D
を出力した直後の状態はどうなっているか。)
Firefox 3 は U+000D
がまだ DOM
には反映されていない (前の x
があるので、 Text 節点はあるが、
x
を削除すると、 Text 節点もない状態のまま)。
Safari 3 は直近の Text 節点は Text 以外のものがでてくるまで DOM に追加されないらしい。ということで実行エラーになる。
Opera 9 は正規化なしということで、 U+000D
まで追加された状態で DOM に入っている。
WinIE 7 はというと、U+000D
は DOM に入っていない状態。
とはいっても、 U+000D
以外の空白も、
非空白がくるまで DOM には入らない仕様らしい (WinIE
の DOM には空白だけの Text は現れないようになってるためだろう)。
ちなみに、 Text にアクセスしたら、次に追加される文字列は新しい Text
になるらしく、 Text が w() 前後で2つに分断される。
w() の前に書いたはずの空白は2つ目の Text に含まれる。
[34] HTML の著者の構文についての規定では明記されていませんが、根要素の外側の空白文字を文字参照として記述することができ、 文字参照ではない空白文字と同様、構文解析時に無視されて DOM に現れません。
[1] Editorial: use more terms from the Infra Standard (annevk著, ) <https://github.com/whatwg/html/commit/104bd78697738af2eab61740a2f1421ae49a3c95>
[36] Editorial: use more terms from the Infra Standard (annevk著, ) <https://github.com/whatwg/html/commit/104bd78697738af2eab61740a2f1421ae49a3c95>