- Unicode は各文字に一意のコード ポイントを割り当て、そのレパートリーを ISO/IEC 10646 と同期させます。
- UTF-8、UTF-16、UTF-32 は同じ文字をエンコードし、ロスレス変換を可能にします。
- 正規化、Bidi、UCD プロパティにより、一貫した比較、順序付け、レンダリングが保証されます。
- Unicode (Web では UTF-8 が望ましい) を採用すると、破損を防ぎ、国際化を促進します。
Unicodeは、コンピュータがテキストを処理する際に使用する共通言語です。ほぼすべての文字体系の各文字と記号に固有の番号を割り当てることで、プラットフォームや国を問わず、テキストをシームレスに保存、処理、共有できるようにします。
この規格は、旧来の文字セット(ASCIIセット、コードページ、EBCDICなど)の限界を克服するために登場しました。旧来の文字セットは不十分であったり、互いに互換性がなかったりしました。現在では、ISO/IEC 10646と同期しており、アルゴリズム(双方向アルゴリズムなど)を維持し、すべてが一貫して動作するようにプロパティと正規化ルールを定義しています。
Unicode とは何ですか? なぜそれほど重要なのですか?
Unicodeは、文字ごとに名前、コードポイント、および一連のプロパティ(スクリプト、カテゴリ、方向性、大文字・小文字など)を記述する、普遍的で常に進化し続ける文字コード規格です。Unicodeコンソーシアム内のUnicode技術委員会(UTC)は、ISO/IEC 10646規格との整合性を維持しています。
その目標は、普遍性、均一性、そして独自性です。明確で再現可能なルールに基づき、多言語テキストの曖昧さのない交換を可能にする幅広いレパートリーを提供します。これにより、現代のテクノロジー(オペレーティングシステム、ブラウザ、XML、Java、データベース)は、ラテン文字とアラビア文字、CJK表意文字、絵文字、技術記号や音楽記号を同一文書内で混在させることができます。
文字、グリフ、コードポイント
Unicodeでは、文字は抽象的な情報単位であり、コードポイントはその数値識別子です。グリフは視覚的な形状(画面に表示されるもの)であり、フォントによって異なります。1つの文字に複数のグリフが存在する場合があり、また、1つのグリフが複数の文字を表す場合もあります。
コードポイントの通常の表記は、16進数でU+XXXXです。分析された資料からの例を挙げると、小文字の「l」はU+006C、合成された小文字の「ü」はU+00FC、「é」はU+00E9、ギリシャ文字のベータは、大文字がU+0392、小文字がU+03B2です(一部のテキストでは「β」はU+0392で引用されていますが、このコードは大文字の「Β」に対応します)。
Unicodeコード空間には1.114.112個の可能な位置(U+10FFFFまで)があり、すべての文字体系と記号を網羅し分類するように構成されており、各バージョンで数万もの有効な割り当てがあり、その数は増え続けています。
計画、エリア、ブロック
Unicodeは文字空間を17のプレーンに分割し、各プレーンは最大65.536のコードポイントで構成されています。この構成により、関連する文字体系や記号を簡単にグループ化し、探しているものを素早く見つけることができます。
最も重要な平面は次のとおりです。基本多言語平面(BMP、平面0)には、ほぼすべての現代アルファベットと多くの記号がまとめられています。補助多言語平面(SMP、平面1)には、歴史的な文字と技術記号(音楽記号や数学記号など)が格納されています。補助表意文字平面(SIP、平面2)は、CJK表意文字を拡張しています。平面14(SSP)には特別なラベルが含まれています。平面15と16は私的使用用です。
ブロックとエリア:地図は非公式にエリアに、そして正式には連続するブロックに細分化されている。ブロックは文字を集計・記録するために使用されるが、必ずしも意味のある言語グループに対応するとは限らない。
CJK 表意文字と Unihan プロジェクト
東アジア(漢)の表意文字は、地域によって様式的な違いはあるものの、Unicodeで統一されており、すべて同じ抽象的な文字を指しています。これらの文字の管理は、中国、日本、韓国、ベトナム、香港、マカオ、シンガポール、米国などから代表者が参加するISO/IEC JTC1/SC2/WG2グループである表意文字報告者グループ(IRG)が行っています。
Unihanデータベースは、さまざまな言語や歴史的・企業的な基準においてこれらの表意文字を扱うために不可欠な補助情報(読み方、意味、等価関係)を集約しています。
主なCJKブロックと拡張機能:
- CJK統合漢字(BMP、U+4E00~U+9FFF): よく使われる文字 20.992 文字。
- 拡張子A(BMP、U+3400~U+4DBF): 6.592 個のあまり使用されない表意文字。
- B-H拡張: SMP/SIP/TIP では、これらは合計で数万個になります (B: U+20000–U+2A6DF、42.720; C: U+2A700–U+2B73F、4.154; D: U+2B740–U+2B81F、222; E: U+2B820–U+2CEAF、5.762; F: U+2CEB0–U+2EBEF、7.473; G: U+30000–U+3134F、4.939;
- その他の関連するCJKブロック: 康熙字の部首(U+2F00~U+2FDF)、CJKの記号と句読点(U+3000~U+303F)、互換性と互換形式、互換表意文字補足など。
Unicodeは、表意文字の組み込みに絶対的な終わりはないと想定しており、表意文字記述シーケンスなどのメカニズムを用いて、符号化されていないシンボルを既存のコンポーネントに分解することで表現することを想定しています(ただし、正規の分解や検索、順序付けなどの操作における保証はありません)。
エンコード形式: UTF-8、UTF-16、UTF-32
Unicodeは、コードポイントを記憶単位に変換する変換形式(UTF)を定義しており、これによりソフトウェアはテキストをその文脈に応じて効率的に処理できるようになります。
UTF-8は、可変長バイト指向のエンコーディング形式で、1バイトあたりU+0000~U+007Fの範囲でASCII互換です。現在の標準では1文字あたり1~4バイトを使用しますが、古い文献では1~6バイトと記載されているものもあり、最新のUnicodeでは1~4バイトとなっています。ウェブ上では最も広く使われている形式です。
UTF-16は16ビット単位を使用します
(1文字あたり1つまたは2つのコード単位):ほとんどのBMP文字は1つの単位に収まります。補助文字はU+D800~U+DFFFの範囲のサロゲートペアを使用します。
UTF-32は固定長で、1文字あたり4バイトです。シンプルですが、容量を多く消費します。文字の直接的なインデックス付けが重要で、メモリ容量に問題がない場合に役立ちます。
UTF-8におけるビットの分配方法
UTF-8フォーマットは、コードポイントビットを1~4バイトのシーケンスに分割し、認識可能なヘッダーを付加することで、曖昧さを回避し、文字境界の検出を容易にします。
| Unicode範囲 | ビットパターン | バイト |
|---|---|---|
| U+0000..U+007F | 0xxxxxxx | 1 |
| U+0080..U+07FF | 110yyyyy 10xxxxxx | 2 |
| U+0800..U+FFFF | 1110zzzz 10yyyyyy 10xxxxxx | 3 |
| U+010000..U+10FFFF | 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx | 4 |
UTF-8の重要な利点は、バイト順序(エンディアン)の問題を回避し、テキストストリームを非常に効率的に処理できることに加え、ASCIIとの下位互換性があることです。
エンコード方式、エンディアン、BOM
UTF形式に加えて、Unicodeは、エンディアンが異なるシステム間でバイトがどのように送信されるか、またバイト順序などの側面がどのように通知されるかを解決するシリアル化方式を規定している。
- UTF-8: エンディアンは適用されません。 バイトオーダーマーク (BOM) はヒントとして使用できますが、デフォルトでは必須でも推奨もされません。
- UTF-16: BE/LE (ビッグ エンディアン/リトルエンディアン) バリアントおよびオプションの BOM (欠落していてプロトコルで定義されていない場合は、ビッグ エンディアンであると想定されます)。
- UTF-32: 類似のルールを持つ BE/LE バリアント。BOM は注文マークとして許可されます。
また、 UTF-16BE/UTF-16LEやUTF-32BE/UTF-32LE(慣例としてBOMなし)などの特定のバリアントや、UTF-7やUTF-EBCDICなどの歴史的な互換性エンコーディング、さらにGB18030(簡体字中国語と繁体字中国語をサポートするUTF-8の中国語版)も存在します。
正規化、合成、同値性
多くの文字は、合成文字として、または基本記号と結合記号の組み合わせとして表すことができます。改訂版の資料からの典型的な例として、合成文字「Ä」は U+00C4 ですが、分解形は「A」(U+0041)+ ダイアレシス(U+0308)です。ベトナム語の「ỗ」は、「o」(U+006F)+ サーカムフレックス(U+0302)+ チルダ(U+0303)として表すことができます。
Unicodeは、標準化された形式と、2種類の等価性(本質的な内容が同じ)と互換性(見た目は同じでも意味が異なる形式)を定義しています。標準化により、信頼性の高い文字列比較が可能になり、重複が削減されます。
双方向アルゴリズムと特殊文字
アラビア語やヘブライ語のような右から左に書く文字体系の場合、Unicodeは標準化され進化し続ける双方向アルゴリズム(Bidi)(例えば、6.3での改訂)を組み込んでおり、ラテン語とアラビア語が混在するテキストが正しい視覚的な順序で表示されるようになっています。
受信した素材に応じて知っておくべきコードポイントのクラス: グラフィック文字 (文字、記号、シンボル)、書式設定 (処理に影響を与える目に見えない文字: U+2028 改行、U+2029 段落区切り、U+00A0 ハードスペース)、互換性のための継承された制御コード (U+0000–U+001F、U+007F、U+0080–U+009F の範囲)、プライベート使用、予約位置、代替文字 (UTF-16 の U+D800–U+DFFF)、および非文字 (各プレーンの U+FFFE、U+FFFF)。
Unicode、ISO/IEC 10646、その他の標準(ASCII、ANSI、コードページ)
UnicodeはISO/IEC 10646(UCS)と同期しており、以前の規格(ASCII、ISO 8859-1、ANSI Z39.64、JIS X 0208、KS X 1001、GB 2312、GB 18030、HKSCS、CNS 11643など)とのマッピングを保持しているほか、製造業者による私的使用のための領域も確保しています。
ASCIIとUnicodeの比較:ASCIIは128文字からなる7ビット文字セットで、基本的な英語には十分ですが、発音記号、表意文字、絵文字を含む言語には不十分です。Unicodeは14万文字以上をカバーしており、UTF-12形式による8/16/32ビットエンコーディングで、文字数は増え続けています。
ANSIとコードページ:「ANSI」は通常、互換性のない8ビットWindowsコードページを指します。OEM-Latin IIを実行しているコンピュータでIBM EBCDIC-Cyrillicのテキストを開くと、文字が正しく表示されません。Unicodeは、単一の文字セットと、その形式間のロスレス変換によってこの問題を解決します。
システム(Windows、Solaris)への実装と変換
Windowsは最新のAPIに内部的にUTF-16を使用しており、 Unicodeとコードページ(SBCS/DBCS/MBCS)間の変換を行うMultiByteToWideCharやWideCharToMultiByteなどの機能を提供しています。コードページへの変換を強制された場合、すべての文字を表現できないとデータ損失が発生する可能性があります。
Windows 上の新しいアプリケーションは、内部的に UTF-16 を使用し、変換処理は周辺機器 (I/O、プロトコル) に任せることで、データの破損を最小限に抑えるべきです。とはいえ、Windows は、やむを得ない場合はコードページとの互換性を維持します。
改訂されたドキュメントによると、Oracle Solaris 11はシステムレベルでUnicode 6.0とISO/IEC 10646:2011をサポートしており、パラメータセットのデフォルト形式としてUTF-8を使用することで、バイト順序の問題を回避し、ASCIIを透過的に保持します。
Unicodeの実践:Web、ドキュメント、プログラミング
ウェブ上では、UTF-8でコンテンツを配信および保存するのが一般的です。HTMLでは、互換性を確保するために「<meta charset="UTF-8">」を宣言し、必要に応じて16進数値エンティティを使用します(例:ユーロ記号「€」)。
Wordでは、カーソルを置いて「挿入」>「記号」を選択するか、コードを入力してAlt+Xを押すことで、Unicode記号を簡単に挿入できます。これにより、標準の手順に従って値が文字に変換されます。キーボードから記号を挿入するためのAltコードの一覧も参照してください。
プログラミング言語では、Python 3では文字列は既にUnicodeです。JavaとC#ではエスケープ文字「\uXXXX」を使用できます。HTMLでは「&#xXXXX;」を使用します。重要なのは、編集、コンパイル、送信のすべてにおいて同じエンコーディングを使用することで、エラーを回避することです。
文字列全体がUnicodeで記述されている場合は、記号のコピー&ペーストは正常に機能します。しかし、文字列の一部が異なるエンコーディングを使用している場合、疑問符、四角、その他の奇妙な記号が表示されることがあります。
文字データベース(UCD)、プロパティとカテゴリ
Unicode文字データベース(UCD)は、各コードポイントについて、その名前、カテゴリ、スクリプト、大文字・小文字の特性、方向性、その他の特性を公開しています。この情報は、レンダリングエンジンやテキスト処理が正しく機能するために不可欠です。
これらの特性のおかげで、異なるコンポーネントやアルゴリズム(ソート、単語分割、大文字/小文字変換など)が同じデータに対して一貫した動作をすることができます。
標準のバージョンと拡張:ハイライト
Unicodeはバージョンアップごとに成長し、新しい文字体系、記号、絵文字が取り入れられています。重要な節目としては、1991年のバージョン1.0(7.161文字)があり、その後、数千もの新しい記号、表意文字、絵文字、文字体系が追加される拡張版が続きます。
例えば、2022年にはバージョン15.0で4.192個のCJK表意文字やその他の要素が追加され、文字数は約149.186文字に達しました。
Unicodeテーブルを探索するためのツール
文字の検索と分析には、Unibook Character Browser、SYMBL、Branah.comなどの無料ユーティリティが利用できます。これらのツールを使えば、プロパティ、名前、文字ブロックを照会できるため、開発者やコンテンツ制作者は必要な情報を素早く見つけることができます。
使用例: 住所フォーム、国際化、ビジネス
ユーザーが自分の言語と文字で住所を入力できるようにすることで、エラーを減らし、ユーザーエクスペリエンスを向上させることができます。さらに、Unicodeの相互運用性により、異なるシステム間での変換問題が防止され、デジタルチェーン全体を通してテキストの整合性が維持されます。
このため、Unicodeは、ウェブフォームからデータベースシステム、印刷物に至るまで、デジタルインフラストラクチャ全体を通してテキストが最終的な状態を維持することを保証する基本的な要素であり、同じ文の中で「ñ」、アラビア語、中国語、絵文字のいずれを使用しても問題ありません。