文字エンコーディングについて考えてみる
2007年1月14日
外部phpファイルをインクルードしたときに、なぜか空白ができてしまいました。
この理由は「文字エンコーディング」にありました。この原因を探ります。
そもそも「文字エンコーディング」ってなんなんでしょう?
文字エンコーディングとは?
ホームページを作るときを考えてみます。
普通、ホームページを作るときは、エディタに日本語あるいは英語、数字を書いてファイルを保存し、サーバにアップして、インターネット上に公開、という流れになります。
このとき、コンピュータでは日本語などの2バイト文字を扱うことができないので、日本語などの文字を数値に変換することで認識します。
これを「文字エンコーディング」といいます。
例えば、「あ」という2バイト文字は数値で表すとどのようになるのかは、文字コードによって決まります。文字コードには、Shift-JISやUnicodeなどがあります。
先ほどの例でですと、「あ」はShift-JISで表すと「0x82A0」で、Unicodeで表すと「0x3042」になります。
ファイルを保存するときに、何で文字エンコーディングするか選ぶことができます。
ただし、使用するエディタによって、文字コードが制限されることがあります。
また、何の文字エンコーディングを使用しなければならないのかは、使用するサーバやプログラムによって異なります。
基本的にhtmlだけで作られているなら、Shift-JISでもよいでしょう。
ただ、動的なプログラム(PHPやJAVA)などを使用するときはサーバサイドの問題で、UTF-8やEUC-JPを使用しなければならないかもしれません。
どのようなプログラムあるいはサーバを使用するときにどの文字エンコーディングを指定すべきかは私もあまりわからないので省きますが、xhtmlについてだけ述べます。
xhtmlで記述した場合は、標準文字エンコーディングがUTF-8あるいはUTF-16になります。
もちろん、最初にXML宣言で、別の文字エンコーディングを指定することも可能です。
ただし、IE6でXML宣言を記述した場合、互換モードになってしまうことを考えると、それが嫌な方はXML宣言を削除する対策をとるのが賢明でしょう。
XML宣言を省くことができるのは、文字エンコーディングがUTF-8あるいはUTF-16のみですので、ファイルはUTF-8あるいはUTF-16の文字エンコーディングで保存しなければなりません。
XHL宣言が省略できる厳密な条件は以下の通りです。
・使用するXMLのバージョンが1.0
・エンコードの種類がUTF-8あるいはUTF-16
・外部DTDを参照する(DOCTYPE宣言を記述する)
ただ、IE7からは、XML宣言を記述しても標準準拠モードになるようになりましたので、これからのモダンブラウザ(ここではweb標準に準拠しているブラウザという意味)のことを考えると、例え上の条件を満たすとしても記述したほうがよいかもしれません(文法的に正しいと言う意味で)。現段階ではIE6の占める割合も多いところなのでどちらを採用するかは個人に委ねることとなるでしょう。
空白ができる理由
最初の問題、phpをインクルードしたら、空白ができてしまった問題を解いていきます。
私は文字エンコーディングにUTF-8を使用していました。
ファイルそのものは、MovableTypeを使用しているので自動に作成してくれます。
しかし、インクルードするファイルは自分の手で作成しなければなりません。
文字エンコーディングをきちんとUTF-8にしたまではよかったのですが、BOM(Byte Order Mark)付きにしてしまったことが原因でした。(自動生成したものはBOMはついていませんでした。)
BOMについて説明するとこれまた長くなるので割愛しますが、BOMをつけると「EF BB BF」という文字をファイルの文頭に出力してしまいます。
これが、空白の原因でした。BOMなしにするとこの空白はなくなりました。
今回の場合空白ができただけでエラーにはなりませんでしたが、phpなどでheader関数を使用している場合、headerよりも前に「EF BB BF」という文字を出力してしまうのでエラーになってしまったりするようです。
そもそもBOMはUTF-16の場合、ビッグエンディアンとリトルエンディアンを区別される場合に用いるのであって、UTF-8ではあまり関係ないようです。
UTF-8にBOMを使用するときは、ビッグエンディアンとリトルエンディアンという概念がないので、あるテキストがUnicodeで記述されているかどうかを自動判定する手段として使用される場合もあるようです。
よくわからないのでなんとも言えませんが、BOMをつけないほうがうまくいくことが多いような気がします。(そのあたりは勉強不足ですね、すみません。)
ファイルを保存するときに文字コーディングを意識したことない人は、大抵Shift-JISで自動に保存されていると思います。
メモ帳のデフォルト設定がANSI(アスキーコードの意味)なので、この場合Shift-JISになるからです。
windowsのメモ帳のいけないところは、UTF-8で保存した場合、BOM付きしかできない点ですね。
文字化けするなどの問題がある場合は、どの文字エンコーディングでファイルを保存したか確認するとよいかもしれませんね。
投稿日:2007年1月14日
↓↓↓トラックバックしてくださった方々↓↓↓
※トラックバックされても管理人がスパムと判断したものは公開されません。
BOM付きUTF-8による空白行
from 最上瞬光 2007/03/28