/[pub]/suikawiki/wikidata/page/48544D4C.ns/B6F5C7F2.txt
Suika

Contents of /suikawiki/wikidata/page/48544D4C.ns/B6F5C7F2.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations) (download)
Thu Sep 18 03:18:18 2008 UTC (16 years ago) by wakaba
Branch: MAIN
CVS Tags: suikawiki3-final, HEAD
Changes since 1.10: +36 -1 lines
File MIME type: text/plain
auto-committed

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

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24