さて、文字コードのことをちょっと調べて何が問題で解決するには最適なのか探ってみました。
日本語文字をデジタルテキストとして表現する主な方式として、シフトJIS, ISO-2022-JP, 日本語EUCの三つがあります。メールやニュースの配送ではISO-2022-JPを使うことが常識になっていますが、WWW によるHTML文書の配送にはこれら三つがすべて使われています。今後は、これらに加えてUnicodeも用いられるようになるものと思われます。
ブラウザは、どの方式を用いているかを知らなければ正しい表示ができません。
WWWでよく見られる文字化けは、どの方式を用いているかが誤って判定したときに起こります。たとえば、日本語EUCで書かれた文書をシフトJISで書かれていると誤って判定すれば、文字化けします。
今回の場合、Yahoo!Japanと私のBlogの文字コードセットが違うのとテンプレートが重い?ためブラウザーのレンダリング時に文字コードの自動認識がおかしな動作をすることが原因のようです。
文字化けをなくすためには、ブラウザで正しく判定できるように、情報を与える必要があります。具体的には、サーバとブラウザの間でやりとりされるMIMEヘッダの中でcharsetパラメタを用いて情報を指定する方法、 HTML文書の中でMETAタグを用いて情報を指定する方法の二つが知られています。
本来あるべき姿は、MIMEヘッダ中のcharsetパラメタによる指定です。残念ながら、これが正しく行えないサーバも存在します。そのための便法として、METAタグによる指定が認められています。ただし、METAタグによる指定だけを行った場合は、正しく動作するという保証はなく、逆に必ず誤動作することもあります。METAタグによる指定はあくまで補助的なものであって、不完全な便法だと考えてください
HTML文書をサーバで公開する方は、可能ならば必ずcharsetパラメタによる指定を行ってください。Apacheという サーバを用いているなら、.htaccessというファイルを作成するだけで、どのユーザにも簡単に指定できます。例えば ISO-2022-JPをcharsetパラメタとして指定するには、
AddType "text/html; charset=ISO-2022-JP" htmlのように.htaccessファイルに記述します。こう記述すれば、このディレクトリ(及びそのサブディレクトリ)に存在する拡張子htmlのファイルすべてに対して、ISO-2022-JPがcharsetパラメタの値になります。日本語EUCの場合はISO-2022-JPの代りにEUC-JPと書き、シフトJISの場合はShift_JISと書きます。
繰り返しますが、サーバがcharsetパラメタを正しく付けるのが本来の方法であり、METAタグによる指定は、これが不可能な場合のための便法です。METAタグを否定する必要はありませんが、可能ならば必ずサーバで charsetパラメタを指定してください。
私のサイトではテンプレートに文字コードをセットして運用していましたが、結局これが原因で文字化けしていた訳です。理由はもともとHTMLでサイトを運用していた所に、MovableTepeを追加して、サイトを運用し始めたため、サーバーに文字コードをセットする訳にもいかないため、サイトのトップページとブログでは使っているコードが違うので、さて困ったものです・・・
そこで、YSTからの検索で最も確実な手法は、テンプレートヘッダーに記載しているcharsetパラメタを完全に削除することで解決しました。これはブラウザーの文字判定に機能を任せる訳です。
コード解析をしてみると、Yahoo!Japanのサイト自体もcharsetパラメタはセットしていませんでしたのでこれでOK?
他にも、「TITLE要素に日本語を使うならば、それより前の段階で明示的にchasetを指定しなければいけない」という噂もきいているかもしれません。
でも、これらの情報は、微妙に間違っているのです。
charsetは、本来はHTML文書の中で指定するものではなく、サーバがHTTPヘッダに付けるべきものです。HTTPヘッダとは、実際にファイルのデータが送付される前にサーバがクライアントに対して送る情報で、「これから送るデータはこういう種類のものだよ」とクライアントに教えるために使われます。ヘッダ情報が無ければ、サーバ/クライアントは膨大なデータ全体をチェックして内容を判断しなければいけません。それを避けるのは当然でしょう。としてみれば、charset情報がヘッダ情報に含まれるべきなのも当然のことです。
charset情報がなければ、本文に使う文字コードがわかりません。だから、先のように「TITLE要素に日本語を使うのは危ない」という意見がでてきます。しかし、サーバがきちんとcharset情報をHTTPヘッダに付けていれば、(META要素などつけなくとも)TITLE要素で日本語を使ってOKです。
ちなみに、「META要素としてcharsetを明示しよう」といわれている原因は、多くのサーバがHTTPヘッダにcharset情報を出していないからです。そして、META要素のcharset指定は「サーバさん、charset情報をHTTPヘッダに付けてよ」というお願いとして提案・導入されたのです。
でも、現状ではMETA要素はそのようには動作していません。なぜなら、これを可能にするには、サーバは、データ送付前にデータの内容をチェックしなければいけないんです。いかにも無理っぽいですよね。
現状では、META要素によるcharset指定は、ただたんにクライアントがチェックするものになっています。これでは、ほとんど意味がありません。charsetは、HTTPヘッダに提示されなければいけないのです。