文字コードと Unicode:UTF-8、UTF-16 からレガシーエンコーディングまで
コンピュータの黎明期、テキストの表現は単純でした。すべての文字が 7 または 8 ビット (ASCII) に収まっていたからです。しかし、コンピュータが世界中に普及するにつれ、あらゆる言語のあらゆる文字を表現する方法が必要になりました。これが Unicode と、それを支えるエンコーディングの物語です。
1. Unicode 標準
Unicode はそれ自体がエンコーディングではなく、ユニバーサルな「文字セット」です。すべての文字に コードポイント と呼ばれる固有の番号を割り当てます(例:'A' は U+0041)。しかし、これらの番号をバイナリとして保存する方法が別途必要になります。
UTF-8(Web の王者)
UTF-8 は、1 文字あたり 1 〜 4 バイトを使用する可変長エンコーディングです。ASCII と完全な互換性があります。
- メリット: 西欧言語において効率的で、データ破損に強く、Web の世界標準となっています。
UTF-16
2 または 4 バイトを使用します。Windows (NTFS) や、Java、JavaScript などの多くのプログラミング環境で内部的なエンコーディングとして採用されています。
UTF-32
すべての文字に固定で 4 バイトを使用します。インデックス操作は単純になりますが、メモリ効率は非常に悪いです。
2. レガシー・地域エンコーディング
Unicode が主流になる前、各地域では独自の標準が使用されていました。その多くは現在でも目にすることがあります。
日本語エンコーディング
- Shift-JIS: 歴史的に日本で最も普及したエンコーディング。Windows や古い Web サイトで広く使用されてきました。
中国語エンコーディング(GB シリーズ)
- GB2312: 簡体字中国語の初期標準。
- GBK: GB2312 を拡張し、より多くの文字をサポートしたもの。
- GB18030: 中国の現在の強制標準。簡体字・繁体字の両方をサポートし、Unicode と完全にマッピングされています。
韓国語と繁体字中国語
- EUC-KR: 韓国語の一般的なレガシーエンコーディング。
- Big5: 台湾や香港を中心に、繁体字中国語で使用される標準。
3. 欧米のレガシーエンコーディング
ISO-8859-1 (Latin-1)
ほとんどの西欧言語をカバーする 8 ビットエンコーディング。
Windows-1252
ISO-8859-1 のわずかなバリエーションで、古い Windows のデフォルトエンコーディングです。
4. 技術的な注意点:BOM とエンディアン
バイトオーダーマーク (BOM)
BOM はテキストファイルの先頭にある特殊なバイト列です(例:UTF-8 では EF BB BF)。ソフトウェアにエンコーディングとバイトオーダーを伝えます。UTF-16 では有用ですが、Web 環境の UTF-8 では使用しないことが推奨されます。
リトルエンディアン vs ビッグエンディアン
UTF-16 や UTF-32 に関わる概念で、バイトがメモリに保存される順番を指します。
比較まとめ
| エンコーディング | 1文字あたりのバイト数 | 互換性 | 最適な用途 |
|---|---|---|---|
| UTF-8 | 1-4 | ASCII | Web, Linux, Mac |
| UTF-16 | 2 または 4 | なし | Windows, Java, JS |
| GB18030 | 1, 2, または 4 | GBK | 中国政府基準準拠 |
| ASCII | 1 | 汎用 | レガシーシステム、英語のみ |
結論
世界はデータ交換の標準として UTF-8 に集約されました。しかし、レガシーシステムや特定の地域向けソフトウェアを扱う際には、Shift-JIS や GBK などの知識が依然として不可欠です。現代のアプリケーション開発では、特に理由がない限り BOM なしの UTF-8 を使用しましょう。