Section 12 : SGML としての HTML(3)

 ここでお話しするのは,HTML で扱われる文字やその振る舞いについてである。

空白文字と改行

 Academic HTML 4.0 の最初で,“HTML では,改行や 2 つ以上の連続した空白は文字どおりの意味を持たない”と述べた。

 HTML において空白文字と見なされるのは

で,これ以外は HTML にとって空白文字たり得ない。

 空白文字は“単語間に入るもの”で,多い場合には圧縮される場合がある。単語間の空白の扱いは言語によってさまざまで,欧文は単語間を半角空白で区切り,タイ語では幅なし空白で区切る。日本語や中国語では単語間に空白は入れないので,空白文字はすべて無視されるということになりそうだが,多くの UA は欧文と同じ扱いをする。

 SGML によれば,改行は空白文字であるほかに,開始タグの直後に現れたとき,および,終了タグの直前に現れたときは空白文字とも見なされず完全に無視される。つまり,

<P>アスファルトの木陰を揚羽蝶が力なく舞っていた。「都会にも,蝶はいるんだ」と妙な思いが頭をよぎった。ぼくの田舎にも,まだ,蝶はいただろうか。</P>

<P>
アスファルトの木陰を揚羽蝶が力なく舞っていた。「都会にも,蝶はいるんだ」と妙な思いが頭をよぎった。ぼくの田舎にも,まだ,蝶はいただろうか。
</P>

は,まったく等価な記述であるが,UA によっては,これが SGML の基本的な要請であるにもかかわらず,半角空白を表示するものもある。前者のような書き方のほうが,現実問題,うまくいくのである。

 逆に,UA によっては,SGML の要請に反して,これが過剰に適用され,開始タグ直後あるいは終了タグ直前の空白が詰まってしまうことがある。したがって,欧文において

<P>Though I tried to recall it, gone<EM> childhood </EM>has taken an eye to the nature away from me.</P>

と書くと,単語間が詰まってしまうおそれがある。

 &nbsp; で参照される無圧縮スペースは,空白文字ではない。一般に,&nbsp; ではテキストの折り返しは起こらず,複数入れても圧縮されないので,欧文などにおいて折り返されると困る句を表現するとき,または,複数の空白をとりたいときなどに用いる。

 日本語においては,全角空白も空白文字ではないので,&nbsp; 同様の振る舞いをする。全角空白をインデントに用いる例も見受けられるが,UA(ブラウザ)の幅が可変であること,インデントやマージンはスタイルシートで実現されることを考えれば,ワープロ・原稿用紙のように全角空白を入れてレイアウトを調整するのはあまり効率のよい方法とは言いがたい。

 念のために触れておくと,整形済みテキスト <PRE> においては,空白文字はそれぞれ固有の意味を持つ。

文字コードセット

 文字コードセットはHTMLにおいて重要なパラメータである。

 HTML の MIME タイプは text/html であるが,それに付随するパラメータが文字コードセットである。

 コンピュータにおけるデータは,結局のところ 0101……であって,それがいったい何を表すのか,というのは大問題である。HTML ファイルはテキストファイルなので,その 0101……をいかに文字にするかというのが問題になってくる。

 本来,文字コードセットの情報は,サーバから HTML ファイルが送られてくるとき,“これから HTML ファイルを送ります。その文字コードセットは……”のようなメッセージとしてついてこさせることができるのだが,“その文字コードセットは……”がどうしたことか,あてにできないことがほとんどである。

 そこで,<META> に書き込むのであるが(本来は,サーバはこれを参考にメッセージを作るべきである!),これがまさしく,そのサーバから送られるメッセージと同等のものなのである。これは本稿の範囲外であるが,そのメッセージは HTTP レスポンスヘッダと呼ばれるもので,これと同様の作用を <META> によって行うのである。

 文字に関してもうひとつ重要な概念は,文字セットである。文字セットとして有名なのは ASCII であるが,世界中のさまざまな言語で書かれる HTML では,とても ASCII 文字セットでは間に合わない。

 HTML において用いられる文字セットは,ISO で定義されたものである。これは前述の Unicode とほとんど同じと思っていただいて差し支えない。

 文字セット中に含まれる文字は,それぞれコードを持っている。だが,これは文字コードセットにおける番号と必ずしも一致しない。文字セットのコードは,HTML という枠組みの中で文字を識別するための番号であるが,文字コードセットによって文字から変換された番号は,多くは文字セット中の一部を,転送などの要請で変換した結果によるものである。したがって,ある文字コードセットでは,HTML の文字セット中の文字の中に直接表現できないものがある可能性があり,その場合に文字セットのコードを用いて参照されるのである。

 現実には,UA(やそれが動いているシステム)が HTML の文字セットをすべて表示できるということは少なく,“表示できない文字”が生じてくる。“表示できない文字”は,その旨表示されるのが望ましいのであるが,実際はその文字は“化けて”しまうことが多い。

 HTML における CHARSET 属性や ACCEPT-CHARSET 属性は,前者はジャンプ先のファイルの文字コードセットを示唆するものだが,後者は,<FORM> に指定され,受け入れる文字コードセットを指定する。処理できない文字コードセットによって CGI プログラムを無駄に走らせることがないようにすることもできよう。このときも,HTML 4 に未対応の UA のことも考えて,CGI プログラムでも送られてくるデータの文字コードセットを適宜処理する防衛手段は講じておくべきである。