HTMLの空白文字

HTMLの空白文字

歴史

HTML 3.2 の規定

[18] HTML 3.2 仕様書では、タグの前後の改行の処理に関する SGML空白の規則を特に紹介しています。

[19] また、 pre 要素内を除き、 複数の空白は1つの SPACE にまとめると規定されています。 ただし、空白の定義はありません。

[20] ちなみに、SGML宣言では RSRE (LINE FEEDCARRIAGE RETURN) と SPACE (SPACE) の他、 SEPCHARTAB として HORIZONTAL TABULATOR機能文字として宣言されています。 この4文字空白ということでよいのでしょうか。

[21] なお、将来の版ではタブの幅がスタイル・シートで制御できるようになるかもしれないと予告されています。 (が、 CSS 2.1 までではまだ実現していません。。。)

[22] 仕様書:

HTML 4 の規定

[2] HTML 4 <IW:HTML4:"struct/text.html#whitespace"> は、次を空白 (white space) 文字としています。

です。 HTML 4 の文書文字集合には他にも定義によっては空白文字に属する文字が色々含まれていますが、 HTML 4 の空白は上記だけです。 HTML 4 仕様書は、他の種類の空白の扱いについては規定せず、 著者は空白制御のためには適切な要素スタイルを使うべき (should) としています。

[3] pre 以外の HTML 要素では、 空白が「」を分離します。 (ここで、語とは、非空白文字の連続体のことです。) UA は、書式付けに際して、その言語用字系および対象媒体の慣習に従って語を識別し、これを配置するべきです (should)。

語間に間隔 (語間 (inter-word) 間隔) を挿入すると見た目が向上するかもしれません。 しかし、間隔の取り方に関する慣習は言語・用字系により種々です。 HTML 4 仕様書が挙げている例では、

  • ラテン文字では間隔を挿入する
  • タイ文字では零幅間隔を挿入する
    • 注: タイ語は、日本語や中文のように語間間隔を入れずに表記します。 だけど零幅間隔を使えば単語境界を機械的に識別できるじゃん! という文脈でよく例になります。 (しかしながら、 TIS620 には零幅間隔はないと思うし、本当に使われているんだか。)
  • 日本語中文では全く語間間隔を表示しない

原始文書中の空白列は、全く異なってレンダリングされるかもしれないことに注意が必要です。 UA は、原始文書中の空白列をレンダリングするときにはまとめて1つ分の語間間隔にするべきです。 これは、自然言語情報 (lang 属性や上位プロトコルからの値) が得られないときでも行うことができ、また行うべき (can & should) とされています。 空白が重要なときには、 pre 要素型を使います。

[4] SGML の規定や既存 UA 実装の問題から、 開始タグ直後や終了タグ直前の空白が表示されることを当てにするべきではありません (should not)。

たとえば、 I <a>love</a> you.I<a> love </a>you. と書いてしまうと、 意図とは異なることが多いでしょう。

SGML の問題は、記録開始記録終了の無視に関する規則のことで、 タグの前後に改行があるときに注意が必要です。 詳しくは SGML//空白を参照。

XHTML m12n の規定

[15] 適合 XHTML族利用者エージェントは次の規則に従って空白を処理しなければなりません XHTML m12n 1.0 FE 3.5

[17] XHTML m12n には LINE FEED の変換方法に関する参考として次の内容の注記があります。

なお、 COMMON 用字系 (句読点など) はもう一方の側と同じ用字系と考えます。 文字の属する用字系の名前は UTR #24 にあります。

[16] 仕様書:

RDFa の規定

[32] 適合RDFa処理器の項になぜか著者に対するアドバイスがあります。

  • XHTML+RDFaXHTML m12n の上に成立している
  • XHTML m12n空白の保持を要求している
  • がしかし、処理器のベースとなっている環境ですべての空白を保持していないかもしれない
  • だから著者は色々な処理器にわたって互換性を保ちたければ不要な空白を予め削除しておくのがよろし

[33] しかし相互運用性がこんなにも危ういなんて XML って怖いですねwww

FORM FEED

[5] HTML 4 は、 >>2 の通り、 U+000C FORM FEED (改頁) を空白の一種としています。

ところが、 HTML 4 の SGML宣言 <http://www.w3.org/TR/html4/sgml/sgmldecl.html> は、 U+000CUNUSED としています。もちろん 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 的には空白として使えません (例えば属性指定の間には使えません)。

VT

[35] U+000B は、一時期 HTML5space characters に含まれていましたが、 CSS 等との整合性のため削除されました。

ZWSP

[8] U+200C ZERO-WIDTH SPACE>>2 の通り HTML で空白として扱われます。 しかし、 SGML 宣言によれば、 s には含まれません。ですから、 HTML 文書の本文では >>2 の通りの扱いを受けますが、 SGML 的には空白として使えません (例えば属性指定の間には使えません)。

タグ前後の空白

[9] SGML の規定により、開始タグ直後と終了タグ直前の改行は全要素 (pretextarea を含みます。) で例外なく無視されます。

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添加要素指定に該当するか否かや改行が CRLF か両方かその他かで細かいところが変わってきます。 (その他なら無視されません。)

(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 でも無視されます。 (名無しさん)

[28] >>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 では CRLFLF だけになる (使用通り)。 Opera 9 では改行正規化は行われていないけど、 この例だけでなく、分断されていない場合であってもそうなる模様。

ちなみに WinIE 7 はなぜか %20 になっている (white-space: pre のときまで!) が気にしない方がよさそうだw

(名無しさん)

[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+000DDOM に入っていない状態。 とはいっても、 U+000D 以外の空白も、 非空白がくるまで DOM には入らない仕様らしい (WinIEDOM には空白だけの 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>

[37] Minutes [was: Agenda for 971106] (Dan Connolly著, ) <https://lists.w3.org/Archives/Public/w3c-wai-hc/1997OctDec/0277.html>

ideographic space

Resolved: remove it from the list of whitespace characters.