小ネタです。
たとえば HTML で <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> のように書くことの意味は、「この文書は HTML であり UTF-8 (と言う文字コード形態)で書かれています」と宣言するということです。これは文書の内容ではなく、その文書自体がどういうものであるか、という「メタ情報」です。だから、meta タグな訳ですが
で、この情報の中で、「UTF-8 である」という部分に関しては、その情報が無いとこの文書自体をまともに取り扱えない可能性がある重要なものです。ここの記述ミスによる文字化けはちょっとネットを見回っている人であればそこらじゅうで見聞きしますね。
しかしそもそもメタ情報というのは、文書そのものに埋め込まれるようなものではないです。なぜならこれは「その文書がどのようなものであるか」という情報な訳ですから、それが文書の中にあるのでは、いくら「自分はこれこれな属性を持った文書です」と言ったところで、その部分を読むより前の部分では、読み込んだアプリケーションはそのメタ情報のことを知らないでいるわけですから。
たとえば、以下のような HTML を書くと簡単に文字化けを起こします。
<html>
<head>
<title>UTF-8 で書かれたタイトル</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
:
「この文書は UTF-8 で書かれています」という宣言の前に UTF-8 で書かれたタイトルが読み込まれて処理されてしまうのです。
まぁ、いくらでも処理のしようはある、という意見も聞こえそうではありますが、大抵はある地域を前提にした解法であり、十分に汎用的な手法ではなかったりするので困るなぁ、というのが今回の趣旨なのですが。
上記の場合は、根本的な解決としては、meta タグのそもそもの存在意義である、「あるコンテンツに特化した HTTP ヘッダの指定」を忠実に守って、meta タグに書くような内容を HTTP サーバが適切にレスポンスヘッダにて返却しさえすれば良い話です。現在は現実的では無いということでサポートされていませんが、代わりに .htaccess という仕組みなどを使うことができます。
以下は文書と文書のメタ情報が切り離されている例です。
: ─┐
Content-Type: text/html; charaset=UTF-8 │ヘッダ
Content-Length: 10234 │
Transfer-Coding: chunked ─┘
<html> ─┐ここからが文書本体
<head> ↓
<title>UTF-8 で書かれたタイトル</title>
</head>
<body>
:
これなら、ヘッダ部だけを見て文書がどのようなものであるかが解るので、それに従って文書を適切に読み込むことができます。逆に言うと、ヘッダを見ないでコンテンツだけを解釈するのは難しいです。
これはいわゆるプロトコル全般に関する基礎知識です。すなわち、機械的に解釈できるように、どのようなものであるかを宣言してからそれを送る、という。上記では「ヘッダ」と呼びましたが、別のプロトコルでは「エンベロープ」つまり「封筒」と呼ばれたりもする部分です。封筒と中身は別の物、封筒の内容と中身が同時に書かれているのは、言ってみれば「葉書」ですが、葉書は宛先を書く部分と本体部分が容易に区別が付きますし、宛先の部分はフォーマットが決まっているのでこれもれっきとしたプロトコルです。しかも、本文がメタ情報に依存して、メタ情報が無いと読むことすらできないというものではありません。
それに比べると、文書の中でその文書自体がどうやったら読み込めるかを記しているというのはまったく非効率でおかしな話なのです。
昨日、xml 宣言や meta タグを見て入力エンコーディングを切り替える処理を書いて、ストリーム途中からの入力エンコーディングの変更が相当に厄介な問題であることを再認識した次第-_-。文字エンコーディングはステートフルなものまであるからねぇ…。
そのようなわけで、文書自体を読み込むために必須のメタ情報が、文書中に埋め込まれているという状況が大変センスの悪いものであるということは伝わったでしょうか。情報をひとくくりにするというメリットとのトレードオフではあるのですが、上記のような明確な区切りを設けていない場合(冒頭の meta タグのようなもの)はセンスが悪いと断言できるでしょう。
まずはここまでで。