文字集合 (キャラクタセット)

特定の文字の集まりとその番号付けの体系。ASCII、ISO 8859、Unicode などが代表的。

文字集合 (キャラクタセット) とは、特定の文字の集まりとそれぞれの文字に割り当てられた番号 (コードポイント) の体系です。ASCII は制御文字を含めて 128 文字、ISO/IEC 8859-1 はラテン文字を中心とした 191 文字、Unicode は 2025 年 9 月に公開された 17.0 で 159,801 文字を定義しています。コンピュータがテキストを扱うための最も基礎的な仕組みであり、どの文字集合を採用するかによって表現可能な文字の範囲が決まります。

文字集合と文字エンコーディングは混同されやすいですが、明確に異なる概念です。文字集合は「どの文字に何番を割り当てるか」という対応表を定義し、エンコーディングは「その番号をどのようなバイト列で表現するか」を定義します。Unicode という文字集合に対して、UTF-8、UTF-16、UTF-32 という複数のエンコーディングが存在するのはこのためです。

歴史的に、各国・各地域が独自の文字集合を策定してきました。日本では JIS X 0208 (第 1・第 2 水準の漢字を中心に約 6,800 文字)、中国では GB 2312 (約 7,400 文字)、韓国では KS X 1001 が使われてきました。JIS X 0208 に収まらない漢字は、のちに JIS X 0213 で追加されています。これらの文字集合は互いに互換性がなく、異なる文字集合で作成されたテキストを開くと文字化けが発生します。Unicode はこの問題を解決するために、世界中の文字を一つの体系に統合した文字集合です。

HTML の <meta charset="UTF-8"> は厳密には文字エンコーディングの指定ですが、歴史的経緯から charset (文字集合) という名前が使われています。Web では UTF-8 が事実上の標準で、W3C の国際化解説も、すべてのコンテンツに UTF-8 を選び、Unicode の符号化方式のうち Web コンテンツに使うべきなのは UTF-8 だけだと案内しています。宣言は複数の層に書けるため、食い違ったときの優先順位を押さえておく必要があります。HTTP レスポンスヘッダーの Content-Type: text/html; charset=UTF-8 はページ内の meta 指定を上書きし、ファイル先頭に BOM があればそれがさらに優先されます。meta を直したのに文字化けが直らないときは、上位のヘッダーや BOM が残っていないかを上から順に確認します。そして、宣言を書くだけでは何も解決しません。実際にその符号化で保存されていなければ、宣言は誤った読み方を指示するだけになります。

よくあるトラブルとして、データベースの文字集合設定の不一致があります。MySQL の utf8 という名前は歴史的に 3 バイトまでの版 (utf8mb3) の別名で、基本多言語面の外にある絵文字 (UTF-8 で 4 バイト) を保存できません。utf8mb4 を使えば Unicode の全文字を格納できますが、直す対象はテーブルとカラムだけではありません。データベース既定の文字集合、接続時に使う文字集合、照合順序 (collation) がそれぞれ別に設定されているため、どこか 1 つが古い設定のまま残っていると、格納も検索も期待どおりには動きません。文字化けの調査では、保存先だけでなく経路のどこで設定が切り替わっているかを順に確かめます。

文字集合の違いは、変換したときの情報の欠落として表面化します。ASCII に日本語は入らず、Shift_JIS が符号化できるのは JIS X 0201 と JIS X 0208 の範囲の文字なので、Unicode から古い文字集合への変換は片道です。入らない文字は「?」や下駄記号 (〓) に置き換わり、あとから元の文字を復元できません。さらに、同じ Unicode を使っていても、実装が対応している版が違えば結果は揃いません。新しい版で追加された文字は、対応していない環境では豆腐と呼ばれる四角い記号として表示されます。多言語を扱うシステムでは、入口から出口まで Unicode で通し、古い文字集合への変換は避けられない出口だけに限定して、そこで何が失われるかを事前に決めておきます。

この記事を共有