/
871.txt
350 lines (271 loc) · 18.4 KB
/
871.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
* 歴史
** HTML 3.2 の規定
[18] [[HTML 3.2]] 仕様書では、[[タグ]]の前後の[[改行]]の処理に関する
[[SGML]] の[[空白]]の規則を特に紹介しています。
[19] また、 [CODE(HTMLe)[[[pre]]]] [[要素]]内を除き、
複数の[[空白]]は1つの [CODE(charname)[[[SPACE]]]]
にまとめると規定されています。
ただし、[Q[[[空白]]]]の定義はありません。
[20] ちなみに、[[SGML宣言]]では [CODE(SGML)[[[RS]]]] と [CODE(SGML)[[[RE]]]]
([CODE(charname)[[[LINE FEED]]]] と [CODE(charname)[[[CARRIAGE RETURN]]]]) と
[CODE(SGML)[[[SPACE]]]] ([CODE(charname)[[[SPACE]]]]) の他、
[CODE(SGML)[[[SEPCHAR]]]] の [CODE(SGML)[[[TAB]]]] として
[CODE(charname)[[[HORIZONTAL TABULATOR]]]] が[[機能文字]]として宣言されています。
この4[[文字]]が[[空白]]ということでよいのでしょうか。
[21] なお、将来の版では[[タブ]]の幅が[[スタイル・シート]]で制御できるようになるかもしれないと予告されています。
(が、 [[CSS 2.1]] までではまだ実現していません。。。)
[22]
仕様書:
- [[HTML 3.2]] ([[W3C]] [[勧告]])
-- [CSECTION@en[HTML as an SGML Application]]
<http://www.w3.org/TR/REC-html32-19970114#sgml>
[[#comment]]
** HTML 4 の規定
[2] HTML 4 <IW:HTML4:"struct/text.html#whitespace">
は、次を[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 <a>love</a> you.]]
を [SAMP(HTML)[I<a> love </a>you.]] と書いてしまうと、
意図とは異なることが多いでしょう。
SGML の問題は、[[記録開始]]や[[記録終了]]の無視に関する規則のことで、
[[タグ]]の前後に改行があるときに注意が必要です。
詳しくは [CODE(SGML)[[[SGML//空白]]]]を参照。
** XHTML m12n の規定
[15] 適合 [[XHTML族利用者エージェント]]は次の規則に従って[[空白]]を処理しなければなりません
[SRC[XHTML m12n 1.0 FE 3.5]]。
- [[空白]]は [[XML 1.0]] の [CODE(ABNF)[[[S]]]]
と同じ4文字です。
-- [CODE(char)[[[U+0009]]]] [CODE(charname)[[[HORIZONTAL TABULATION]]]]
-- [CODE(char)[[[U+000A]]]] [CODE(charname)[[[LINE FEED]]]]
-- [CODE(char)[[[U+000D]]]] [CODE(charname)[[[CARRIAGE RETURN]]]]
-- [CODE(char)[[[U+0020]]]] [CODE(charname)[[[SPACE]]]]
- [[XML]] [[処理器]]は[[改行]]を[[正規化]]し、
[[応用]]に渡します。
- [[利用者エージェント]]は [[XML]] [[処理器]]から受取ったデータを次のように処理しなければなりません。
-- [[ブロック要素]]を囲む[[空白]]はすべて除去するべきです。
-- [[注釈]]は完全に除去し、[[空白]]の処理に影響させてません。
[[注釈]]の両側の[[空白]]は2つの[[空白]]として扱います。
-- [CODE(XMLa)[[[xml]]:[[space]]]] が [CODE(XML)[[[preserve]]]]
であれば[[空白]]は保存しなければならず、[[ブロック]]中の
[CODE(charname)[[[LINE FEED]]]] を変換してはなりません。
-- [CODE(XMLa)[[[xml]]:[[space]]]] が [CODE(XML)[[[preserve]]]]
でなければ、
--- [[ブロック要素]]の先頭と末尾の[[空白]]は除去しなければなりません。
--- [CODE(char)[[[LINE FEED]]]] は
[CODE(char)[[[SPACE]]]], [CODE(char)[[[ZERO-WIDTH SPACE]]]]
([CODE(char)[[[U+200B]]]]) のいずれかに変換するか、
または削除しなければなりません。
3通りのいずれを選ぶかは[[利用者エージェント]]依存で、
[CODE(char)[[[LINE FEED]]]] の前後の[[用字系]]によります。
--- [CODE(char)[[[LINE FEED]]]] なしの[[空白]]の列は
[CODE(char)[[[SPACE]]]] 1文字に置換しなければなりません。
--- [CODE(char)[[[LINE FEED]]]] が1つ以上含まれる[[空白]]の列は、
[CODE(char)[[[LINE FEED]]]] が1つだけの時と同じように置換しなければなりません。
- [[属性値]]における[[空白]]は [[XML 1.0]]
に従って処理します。
[17] [[XHTML m12n]] には [CODE(char)[[[LINE FEED]]]]
の変換方法に関する参考として次の内容の注記があります。
- [CODE(char)[[[LINE FEED]]]] の前後の[[文字]]の[[用字系]]が同じであり、
[CODE(char)[[[SPACE]]]] が[[語]]分離子として使われるものであるなら、
[CODE(char)[[[SPACE]]]] に変換するべきです。
([[ラテン文字]]、[[ギリシャ文字]]、[[キリル文字]]など)
- [CODE(char)[[[LINE FEED]]]] の前後の[[文字]]の[[用字系]]が[[表意文字]]系や[[語]]分離子を使わない[[書字方法]]なら、
除去するべきです。 ([[中文]]、[[日本語]]など)
- [CODE(char)[[[LINE FEED]]]] の前後の[[文字]]の[[用字系]]が非[[表意文字]]系で[[語]]分離子を使わないものなら、
[CODE(char)[[[ZERO-WIDTH SPACE]]]] に変換するか、
または除去するべきです。
- 前三項の条件に該当しないなら、 [CODE(char)[[[LINE FEED]]]]
は [CODE(char)[[[SPACE]]]] に変換するべきです。
なお、 [CODE[COMMON]] [[用字系]] ([[句読点]]など)
はもう一方の側と同じ[[用字系]]と考えます。
[[文字]]の属する用字系の名前は [[UTR]] #24 にあります。
[16] 仕様書:
- [[XHTML m12n]]
-- [CSECTION[3.5. XHTML Family User Agent Conformance]]
<IW:XHTML1m12n:"conformance.html#s_conform_user_agent">
** RDFa の規定
[32]
[[適合RDFa処理器]]の項になぜか[[著者]]に対するアドバイスがあります。
- [[XHTML+RDFa]] は [[XHTML m12n]] の上に成立している
- [[XHTML m12n]] は[[空白]]の保持を要求している
- がしかし、[[処理器]]のベースとなっている環境ですべての[[空白]]を保持していないかもしれない
- だから[[著者]]は色々な[[処理器]]にわたって互換性を保ちたければ不要な[[空白]]を予め削除しておくのがよろし
;; [CITE@en[RDFa in XHTML: Syntax and Processing]] ([TIME[2008-10-14 00:17:32 +09:00]] 版) <http://www.w3.org/TR/2008/REC-rdfa-syntax-20081014/#processorconf>
[33] しかし[[相互運用性]]がこんなにも危ういなんて [[XML]] って怖いですねwww
** FORM FEED
[5] HTML 4 は、 >>2 の通り、 [CODE(char)[U+000C]]
[CODE(char)[FORM FEED]] ([[改頁]]) を空白の一種としています。
ところが、 HTML 4 の [[SGML宣言]]
<http://www.w3.org/TR/html4/sgml/sgmldecl.html>
は、 [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'' <http://www.w3.org/TR/xhtml1/#C_15>
は、 HTML では [CODE(char)[U+000C]]
を使えるが、 XHTML では使えないと言っています。
[7] 本文が正しく、 [CODE(char)[U+000C]] が使えたとしても、
[CODE(SGML)[s]] には含まれないので、 HTML 文書の本文では >>2
の通りの扱いを受けますが、 SGML 的には空白として使えません
(例えば[[属性指定]]の間には使えません)。
** VT
[35] [CODE(char)[[[U+000B]]]] は、一時期 [[HTML5]] で [[space characters]] に含まれていましたが、
[[CSS]] 等との整合性のため削除されました。
** ZWSP
[8] [CODE(char)[U+200C]] [CODE(char)[ZERO-WIDTH SPACE]]
は >>2 の通り HTML で空白として扱われます。
しかし、 SGML 宣言によれば、 [CODE(SGML)[s]]
には含まれません。ですから、 HTML 文書の本文では >>2
の通りの扱いを受けますが、 SGML 的には空白として使えません
(例えば属性指定の間には使えません)。
** タグ前後の空白
[9] SGML の規定により、[[開始タグ]]直後と[[終了タグ]]直前の改行は全要素
([CODE(HTMLe)[[[pre]]]] や [CODE(HTMLe)[[[textarea]]]] を含みます。)
で例外なく無視されます。
HTML 4 [CITE[B.3.1 Line breaks]]
<IW:HTML4:"appendix/notes.html#notes-line-breaks">
例 [SRC[HTML 4 B.3.1]]: 次の2段落は同じ内容です。
[PRE(HTML)[
<P>Thomas is watching TV.</P>
<P>
Thomas is watching TV.
</P>
]PRE]
なお、 [[XHTML]] ではこの規定は適用されません。2つ目の段落の内容は改行を含みます。
詳しくは [[SGML//空白]]をご覧下さい。
[10]
>>9 HTML 4 附属書 B (参考) には[Q[すべての要素で例外なく]]なんて書いてありますが、
実際には[[強制空要素]]が例外になりますし、要素が [[DTD]] の[[添加要素指定]]に該当するか否かや改行が
[CODE(char)[[[CR]]]] か [CODE(char)[[[LF]]]] か両方かその他かで細かいところが変わってきます。
(その他なら無視されません。)
(XHTML はやっぱりこの問題はありません。
[[XML]] では実体を読んだら最初に改行を正規化してしまいますから。)
([[名無しさん]])
[26]
[CITE[Live DOM Viewer]] ([CODE[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>
[CODE(HTMLe)@en[[[pre]]]] [[要素]]先頭が[[数値文字参照]]となった[[改行]]であるとき、その[[改行]]は無視されるのか?
- [[HTML 2]] ([[SGML]]): 無視されない
- [[HTML 3.2]] ([[SGML]]): 無視されない
- [[HTML 4]] ([[SGML]]): 無視されない
- [[XHTML 1]] ([[XML 1]]): 無視されない
- [[HTML 5]]: 無視される
- [[XHTML 5]] ([[XML 1]]): 無視されない
- [[WinIE 7]]: 無視される
- [[Safari]] 3.1.1: 無視される
- [[Firefox]] 2: 無視されない
- [[Opera]] 9.27: 無視されない
([[名無しさん]])
[27]
[CITE[Live DOM Viewer]] ([CODE[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 と同じく、 [CODE(HTMLe)@en[[[textarea]]]] [[要素]]の場合、
[[Firefox]] 2 と [[Opera]] 9.27 でも無視され''ます''。
([[名無しさん]])
[28]
>>27 ちなみに、途中や末尾の[[改行]]の[[文字参照]]は無視されないようです。
** メモ
[11]
[CITE[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]] は[[ラテン文字]]以外に関する規定がないので将来この部分は修正されるかもしれないとされています。
仕様書:
- [[XHTML 1.0]]
-- [CSECTION[3.2. User Agent Conformance]]
<IW:XHTML10:"uaconf">
([[名無しさん]] [sage])
[13]
XHTML 1.0 での予告通り(?) [[XHTML m12n]]
では説明が細かくなっています。
- [[XHTML m12n]]
-- [CSECTION[3.5. XHTML Family User Agent Conformance]]
<IW:XHTMLm12n:"conformance.html#s_conform_user_agent">
([[名無しさん]] [sage])
[14]
>>12-13
正確には、 [[XHTML 1.0]] [[FE]] であった
[CODE(XMLa)[xml:space]] の部分が
[[XHTML m12n]] には引き継がれてますが、
[[XHTML 1.0]] [[SE]] ではカットされていますね。
([[名無しさん]] [sage])
[23]
[[Line Mode Browser]] 1.2a (1992年2月?) は、[[バグ]]の修正として、
[[空白]] (表示上の?) の後に続く[[改行]]は無視するようにした、
とあります。この修正によって[[段落]]の[[タグ]]の後に[[改行]]があっても余分な[[空白]]が表示されなくなるそうです。
;; [CITE@en[Change History of Line Mode Browser]]
<http://www.w3.org/LineMode/User/Features.html>
([[名無しさん]] [sage])
[24]
[CITE[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]] ([CODE[2002-12-03 10:46:24 +09:00]] 版) <http://www.sic.med.tohoku.ac.jp/~satodai/w3m-dev/200212.month/3507.html>
([[名無しさん]] [WEAK[2007-05-17 11:50:50 +00:00]])
[25]
[CITE[''''''[''''''w3m-dev 04238'''''']'''''' [patch] simple preserve space]] ([[]] 著, [CODE[2007-05-15 02:45:54 +09:00]] 版) <http://permalink.gmane.org/gmane.comp.web.w3m.devel/905>
([[名無しさん]] [WEAK[2007-05-17 11:54:17 +00:00]])
[29]
[CITE[''''''[''''''emacs-w3m:10278'''''']'''''' Re: w3m eats spaces]] ([[Katsumi Yamaoka]] 著, [CODE[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 では[[改行]]の[[正規化]]は行われていないけど、
この例だけでなく、分断されていない場合であってもそうなる模様。
;; ちなみに [[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> にしたらどうなるか?
([CODE(char)[[[U+000D]]]] を出力した直後の状態はどうなっているか。)
[[Firefox]] 3 は [CODE(char)[[[U+000D]]]] がまだ [[DOM]]
には反映されていない (前の [Q[x]] があるので、 Text 節点はあるが、
[Q[x]] を削除すると、 Text 節点もない状態のまま)。
[[Safari]] 3 は直近の Text 節点は Text 以外のものがでてくるまで [[DOM]]
に追加されないらしい。ということで実行エラーになる。
[[Opera]] 9 は[[正規化]]なしということで、 [CODE(char)[[[U+000D]]]]
まで追加された状態で [[DOM]] に入っている。
[[WinIE 7]] はというと、[CODE(char)[[[U+000D]]]] は [[DOM]] に入っていない状態。
とはいっても、 [CODE(char)[[[U+000D]]]] 以外の[[空白]]も、
非[[空白]]がくるまで [[DOM]] には入らない仕様らしい ([[WinIE]]
の [[DOM]] には[[空白]]だけの Text は現れないようになってるためだろう)。
ちなみに、 Text にアクセスしたら、次に追加される文字列は新しい Text
になるらしく、 Text が w() 前後で2つに分断される。
w() の前に書いたはずの[[空白]]は2つ目の Text に含まれる。
[34] [[HTML]] の[[著者]]の構文についての規定では明記されていませんが、[[根要素]]の外側の[[空白文字]]を[[文字参照]]として記述することができ、
[[文字参照]]ではない[[空白文字]]と同様、構文解析時に無視されて [[DOM]] に現れません。