エンコーディング

2015.07.27

エンコーディングとは

コード化すること・符号化することである。エンコーディングは信号や情報をデジタル化して通信したり、動画ファイルを圧縮してデータ量を減らしたり、URL(Uniform Resource Locators)の中で使えない文字を%に続く16進数で表す(percent encoding)など、広範な文脈で使われる。HTML(Hypertext Markup Language)やXML(Extensible Markup Language)においては、テキストをどのような文字コードを使って、どのような形式で表すかを文字エンコーディング(character encoding、略してエンコーディング)という。ここでは主に文字エンコーディングについて説明する。

 

もっと詳しく!

文字コード

文字をコンピュータで取り扱うために、文字をあつめて整理したうえで、それぞれの文字に一定の規則に従って番号を割り当てる。こうして作成したものを符号化文字集合(coded character set)、親しみやすい言葉では文字コードという。日本ではJIS X 0201、JIS X0208、JIS X 0213など、米国ではASCII(American Standard Code for Information Interchange)、ISOが定めるISO/IEC 646、ISO/IEC 8859などの様々な地域別文字コードが使われている。21世紀にはグローバルな文字コードであるUnicodeが主流になっている。

 

文字エンコーディング

文字に番号を割り当てることをエンコーディングということもある。HTMLやXMLでいう文字エンコーディングは、そうではなく、文字を並べたテキストに関するものである。すなわち、文字コードによってテキストをあらわす方式、その方式の名称、ファイルにおいてその方式を指定する仕組み、テキスト・ファイルがどのような方式で表されているかを認識する仕組みなどである。

 

Unicodeのエンコーディング方式

Unicodeは1文字を2バイトまたは3バイトで表す。Unicodeでコード化した情報をテキスト・ファイルなどで交換するためにバイト単位で表現できるエンコーディング方式が規定されている。主なエンコーディング方式の名前と特長を次に示す。なおUTF-16、UTF-32は1文字を複数バイトで表すので、上位のバイトを先に出すか後に出すかというバイト順序の指定が必要である。BOM(バイト・オーダー・マーク)はバイト順序を識別するためのものである。

イ.UTF-8
Unicodeの文字を1バイトから最大4バイトまでの可変長で表す。ASCIIコードにあるアルファベットや数字についてはASCIIコードと同じである。ラテンの拡張文字は2バイト、漢字は多くが3バイトで表される。BOMは不要であるが、禁止はされていない。但し、UTF-8のBOMを解釈しないツールで読むときにトラブルになることがあるのでBOMが付いている時は注意が必要である。

ロ.UTF-16
Unicodeの各文字を2バイト固定長で表す方式である。Unicodeの文字の一部は2バイトだけでは表せないので、2つの2バイトコードを組み合わせて1文字を表すようにしたサロゲート・ペアを使う。UTF-16の派生としてUTF-16BE、UTF-16LEがある。BE(ビッグエンディアン)、LE(リトルエンディアン)のようにエンコーディング名にバイト順が含まれるときはファイルにBOMは付けない。

ハ.UTF-32
Unicodeの各文字を4バイト固定長で表す方式である。UTF-32の派生としてUTF-32BE、UTF-32LEがある。

 

その他のエンコーディング方式

日本語の地域別エンコーディング方式では、次の二つが良く使われる。いずれも徐々にレガシーになりつつある。

イ.Shift_JIS
JIS X0201(1バイトのアルファベット、カタカナ)とJIS X0208 (かなと第二水準までの漢字コード)を組み合わせて使う可変長のエンコーディングである。初期のマイクロソフトOSなどが採用したことから、長い間、日本で主流であった。現在は、Unicodeにとって代わられつつある。

ロ.ISO-2022-JP
ASCII文字とJIS X0208をエスケープシーケンスで切り替えて使う方式である。インターネットのメールなどで普及している。

 

エンコーディング名

エンコーディングの名前は、IANA(Internet Assigned Numbers Authority)に文字セット(Character Sets)として登録されている。IANAでは文字セットという。エンコーディングといういい方をするようになったのは比較的新しいのだろう。エンコーディングの名前は、大文字と小文字を区別しないのが一般的である。

 

テキスト・ファイルのエンコーディング

例えばShift_JISでエンコーディングしたテキスト・ファイルを、電子メールに添付して送信し、受信側でWindow8のメモ帳で開くと文字化けすることがある。これは、電子メールで送信している間に、テキスト・ファイルのエンコーディングが変わってしまうためのようだ。このようにテキスト・ファイルを保存したときのエンコーディングとファイルを読み込むときのエンコーディングが違うと文字化けしてしまう。テキスト・ファイルの先頭数千バイトを読んで、エンコーディングを自動的に判別するプログラムを作るとして、ある程度は自動判別できても、完全な自動判別はできないだろう。

 

HTMLファイルのエンコーディング

HTML5ファイルの文字エンコーディングは、meta要素のcharset属性にエンコーディング名を使って指定する。UTF-8が標準であり、UTF-32を使うのははやめる方が良いとされている。HTML5にはエンコーディング仕様(http://www.w3.org/TR/encoding/)が付随しており、この仕様に記載しているエンコーディングはサポートされる。

 

XMLファイルのエンコーディング

XMLではデフォルトエンコーディングはUTF-8である。それ以外のエンコーディングを使うときは、次のようにXML宣言で明示しなければならない。

<?xml version="1.0" encoding="shift_jis" ?>

 

[小林 徳滋 アンテナハウス株式会社 20150713]

[一部修正 20160219]