Let's begin XHTML―さあ始めよう XHTML

Appendix A:文字エンコーディング

 日本語の WWW ページは,文字化けすることがある。これは,文字エンコーディングの推定を誤って出力したからである。また,XHTML では,冒頭の XML 宣言に文字エンコーディングを書き込む。ここでは,この“文字エンコーディング”について,簡単にまとめておく。

文字エンコーディングとは

 文字エンコーディングは,文字を,伝送・蓄積などのために数値に直すやり方をさす。文字コードセットともいう。

 コンピュータでは,まず,どんな文字を使うのか決めなくてはならない。英語であれば,さしあたっては英数字と基本的な記号があればよいだろう。ヨーロッパ言語全般なら,これにアクセントがついたアルファベットが必要になってくる。日本語は,英数字も使うが,かな・漢字が必須だ(これは欧米の言語に比べたらたいへんな数になる)。韓国語なら,ハングルと漢字が要る。

 どんな文字を使うかを決めたところで,これを伝送・蓄積するには,それをどのように数値に直すか(番号を振るか)という約束を決めなくてはならない。これが文字エンコーディングである。送り手では文字を番号に変え,それを送り,受け手では番号から対応する文字に直す。文字エンコーディングが決められて,文字が伝わる。

日本語の文字エンコーディング

 日本語の特徴は,とかく使う文字種が多いことである。もとより英数字さえ使えればよいように設計されていたコンピュータに日本語を扱わせるには相当の苦労があったことだろう。

 成立の経緯から,WWW では主に日本語の文字エンコーディングに

  • ISO-2022-JP(一般には JIS と呼ばれている)
  • 日本語 EUC
  • シフト JIS

が使われている。

ISO-2022-JP(JIS)

 ISO-2022-JP(以下,JIS)は,電子メールでよく使われている日本語の文字エンコーディングである。

 JIS では,半角英数字・半角カタカナ・全角文字について“モード”を割り当て,特別な符号でこれらを切り替える。たとえば,半角英数字中に漢字が混じっている場合,漢字の前後には“全角文字モード”および“半角英数字モード”の符号が入っている。

 この形式は,今のモードが何であるかを覚えておかないと,文字を特定できない。つまり,テキスト中の特定の部分を指したところで,そこから前をたどってモードを確かめなければならない。という理由で,テキストの内部処理には向いていないとされる。

 このエンコーディングを示すのは,“ISO-2022-JP”である。

日本語 EUC

 日本語 EUC(Extended Unix Code) は,主に UNIX ワークステーションで日本語の文字を扱うために作られた文字エンコーディングである。一般に,Linux/UNIX では,標準的にこの文字エンコーディングで文字が処理される。

 日本語 EUC では,1 バイトめで文字種を判別する。この 1 バイトめの値の範囲で,半角英数字・半角カタカナ・全角文字が決まる。文字種が半角カタカナ・全角文字であったら,2 バイトめと組み合わせて文字に変換する。要するに,半角英数字は 1 バイト,半角カタカナ・全角文字は 2 バイトで表される。

 このエンコーディングを示すのは,“EUC-JP”である。

 厳密には,“補助漢字”という文字のグループもあり,1 バイトめでこのグループであることがわかると,続く 2 バイトと組み合わせて 1 文字とする(3 バイトで 1 文字になる)。ただし,補助漢字が使われることは少ない。

シフト JIS

 シフト JIS は,主にパーソナルコンピュータ(Windows,Mac OS)で使われる文字エンコーディングである。一般に,Windows,Mac OS では,日本語の文字の外部表現にこのエンコーディングを使う。

 シフト JIS も,1 バイトめで文字種を判別する。1 バイトめの値の範囲が全角文字を示すものであれば,次の 1 バイトと組み合わせて文字に変換する。つまり,半角英数字・半角カタカナは 1 バイト,全角文字は 2 バイトで表される。

 このエンコーディングを示すのは,“Shift_JIS”である。

 ここで,日本語 EUC とシフト JIS は,いずれも 1 バイトめで文字種を判別する。この特徴が似ているために,日本語 EUC とシフト JIS が取り違えられて文字化けを起こすことがある。

ISO 10646(Unicode)の文字エンコーディング

 前述したように,コンピュータで文字をやり取りするには,どんな文字を使うのかを予め決める。この,“使用する文字”を世界中の文字に広げようとして定められたものが ISO 10646 である。2005 年 5 月現在では,Unicode とほぼ同じものと考えて差し支えない。NT 系 Windows(Windows 2000 および XP 含む)は,文字の内部表現形式は Unicode である。

 ISO 10646 の文字のエンコーディングとして,よく使用されるのが UTF-8 および UTF-16 である。

 UTF-8 は,文字を可変長(1〜6)のバイト列で表す。たとえば,半角英数字は 1 バイト,全角文字・半角カタカナは 3 バイトとなる。UTF-8 には,ファイルの先頭にバイトオーダマーク(BOM)と呼ばれる 3 バイトの符号が書き込まれることがあるが,WWW では,通常,これをつけない UTF-8 エンコーディングが用いられる(これを特に UTF-8N と呼ぶ場合もある)。

 UTF-16 は 2002 年 10 月現在あまり使用されていないようなので詳しくは省略するが,半角英数字は 2 バイトで表される。バイトオーダマークが先頭につくことがある。また,サロゲートペアと呼ばれるバイト列で,UTF-8 よりも広い範囲の,ISO 10646 中の文字を表すことができるようになっている。

 UTF-8 および UTF-16 は,それぞれ“UTF-8”および“UTF-16”で示され,いずれも XML の標準的な文字エンコーディングとされている。

 ここでは,コンピュータで文字を表すのに,まず使う文字を決め,それをどう数値に直すかという問題があることを知っていただきたい。また,その文字の決め方,数値への直し方にはさまざまな方法があることを理解していただきたい。それを気にとめながら,お使いの文字エンコーディングや,テキストエディタの設定などを確認して,WWW ページ作りの知識としていただければよいだろう。

 なお,本ページの説明は厳密性を目指していない。さらに文字エンコーディングについて知りたければ,しかるべき書籍・WWW ページを参照されたい。