Unicodeは、世界の大部分の文字体系でテキストを表し、管理するための標準です。テキストを扱うほとんどの最新のソフトウェアはUnicodeをサポートしています。この標準はUnicodeコンソーシアムによって維持されています。新しいバージョンの標準は毎年(新しい絵文字などと共に)公開されます。Unicodeバージョン1.0.0は1991年10月に公開されました。
Unicodeを理解するために重要な2つの概念があります。
最初のUnicodeバージョンでは、16ビットのコードポイントを使用していました。それ以来、文字数は大幅に増加し、コードポイントのサイズは21ビットに拡張されました。これらの21ビットは、それぞれ16ビットの17面で区切られています。
面1~16は、補足面またはアストラル面と呼ばれます。
いくつかの文字のコードポイントを確認してみましょう。
> 'A'.codePointAt(0).toString(16)'41'
> 'ü'.codePointAt(0).toString(16)'fc'
> 'π'.codePointAt(0).toString(16)'3c0'
> '🙂'.codePointAt(0).toString(16)'1f642'
コードポイントの16進数は、最初の3つの文字は面0(16ビット以内)にあり、絵文字は面1にあることを示しています。
コードポイントをエンコードする主な方法は、3つのUnicode変換形式(UTF):UTF-32、UTF-16、UTF-8です。各形式の末尾の数字は、そのコードユニットのサイズ(ビット単位)を示します。
UTF-32は、コードユニットの格納に32ビットを使用し、コードポイントごとに1つのコードユニットになります。この形式は、固定長エンコーディングを持つ唯一の形式です。他の形式はすべて、単一のコードポイントをエンコードするために可変数のコードユニットを使用します。
UTF-16は16ビットのコードユニットを使用します。コードポイントは次のようにエンコードされます。
BMP(Unicodeの先頭16ビット)は単一のコードユニットに格納されます。
アストラル面:BMPは0x10_000個のコードポイントで構成されています。Unicodeの合計コードポイント数は0x110_000個であるため、残りの0x100_000個のコードポイント(20ビット)をまだエンコードする必要があります。BMPには、必要なストレージを提供する割り当てられていないコードポイントの2つの範囲があります。
言い換えれば、末尾の2つの16進数は8ビットに寄与します。しかし、BMPが次の2桁のペアのいずれかで始まる場合にのみ、これらの8ビットを使用できます。
サロゲートごとに、4つのペアを選択できます。これが残りの2ビットの出所です。
その結果、各UTF-16コードユニットは、常に上位サロゲート、下位サロゲート、またはBMPコードポイントのいずれかをエンコードします。
UTF-16でエンコードされたコードポイントの2つの例を次に示します。
🙂
)はアストラル面にあり、2つのコードユニット0xD83Dと0xDE42で表されます。UTF-8は8ビットのコードユニットを使用します。コードポイントをエンコードするために1〜4個のコードユニットを使用します。
コードポイント | コードユニット |
---|---|
0000–007F | 0bbbbbbb(7ビット) |
0080–07FF | 110bbbbb、10bbbbbb(5+6ビット) |
0800–FFFF | 1110bbbb、10bbbbbb、10bbbbbb(4+6+6ビット) |
10000–1FFFFF | 11110bbb、10bbbbbb、10bbbbbb、10bbbbbb(3+6+6+6ビット) |
注記
3つの例
文字 | コードポイント | コードユニット |
---|---|---|
A | 0x0041 | 01000001 |
π | 0x03C0 | 11001111, 10000000 |
🙂 |
0x1F642 | 11110000, 10011111, 10011001, 10000010 |
Web開発で使用されるUnicodeエンコーディング形式は、UTF-16とUTF-8です。
ECMAScript仕様では、ソースコードは内部的にUTF-16として表現されます。
JavaScript文字列の文字は、UTF-16コードユニットに基づいています。
> const smiley = '🙂';
> smiley.length2
> smiley === '\uD83D\uDE42' // code unitstrue
Unicodeと文字列の詳細については、§20.7「テキストの原子:コードポイント、JavaScript文字、グラフェムクラスタ」を参照してください。
HTMLとJavaScriptは、現在ほとんどの場合UTF-8でエンコードされています。
たとえば、HTMLファイルは現在通常このように始まります。
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
···
Webブラウザで読み込まれるHTMLモジュールの場合、標準エンコーディングもUTF-8です。
世界のさまざまな文字体系を考慮すると、文字の概念は非常に複雑になります。そのため、「文字」をある意味で表すいくつかの異なるUnicode用語があります。コードポイント、グラフェムクラスタ、グリフなどです。
Unicodeでは、コードポイントはテキストの原子単位です。
しかし、グラフェムクラスタは、画面または紙に表示される記号に最も近いものです。「水平方向に分割可能なテキスト単位」として定義されています。そのため、公式のUnicodeドキュメントでは、ユーザーが認識する文字とも呼ばれています。グラフェムクラスタをエンコードするには、1つ以上のコードポイントが必要です。
たとえば、デーバナーガリー文字のkshiは4つのコードポイントでエンコードされています。Array.from()
を使用して文字列をコードポイントを含む配列に分割します(詳細は、§20.7.1「コードポイントの操作」を参照してください)。
国旗の絵文字もグラフェムクラスタであり、2つのコードポイントで構成されています。たとえば、日本の国旗などです。
記号は抽象的な概念であり、書かれた言語の一部です。
概念とその表現の区別は微妙であり、Unicodeについて話す際には曖昧になる可能性があります。
グラフェムクラスタの詳細情報
詳細については、Manish Goregaokarによる“Let’s Stop Ascribing Meaning to Code Points”を参照してください。
クイズ
クイズアプリを参照してください。