JavaScript入門(ES2022版)
本書をサポートしてください:購入 または 寄付
(広告、ブロックしないでください。)

19 Unicode – 簡単な紹介(上級)



Unicodeは、世界の大部分の文字体系でテキストを表し、管理するための標準です。テキストを扱うほとんどの最新のソフトウェアはUnicodeをサポートしています。この標準はUnicodeコンソーシアムによって維持されています。新しいバージョンの標準は毎年(新しい絵文字などと共に)公開されます。Unicodeバージョン1.0.0は1991年10月に公開されました。

19.1 コードポイントとコードユニット

Unicodeを理解するために重要な2つの概念があります。

19.1.1 コードポイント

最初の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にあることを示しています。

19.1.2 Unicodeコードポイントのエンコーディング:UTF-32、UTF-16、UTF-8

コードポイントをエンコードする主な方法は、3つのUnicode変換形式(UTF):UTF-32、UTF-16、UTF-8です。各形式の末尾の数字は、そのコードユニットのサイズ(ビット単位)を示します。

19.1.2.1 UTF-32(Unicode変換形式32)

UTF-32は、コードユニットの格納に32ビットを使用し、コードポイントごとに1つのコードユニットになります。この形式は、固定長エンコーディングを持つ唯一の形式です。他の形式はすべて、単一のコードポイントをエンコードするために可変数のコードユニットを使用します。

19.1.2.2 UTF-16(Unicode変換形式16)

UTF-16は16ビットのコードユニットを使用します。コードポイントは次のようにエンコードされます。

言い換えれば、末尾の2つの16進数は8ビットに寄与します。しかし、BMPが次の2桁のペアのいずれかで始まる場合にのみ、これらの8ビットを使用できます。

サロゲートごとに、4つのペアを選択できます。これが残りの2ビットの出所です。

その結果、各UTF-16コードユニットは、常に上位サロゲート、下位サロゲート、またはBMPコードポイントのいずれかをエンコードします。

UTF-16でエンコードされたコードポイントの2つの例を次に示します。

19.1.2.3 UTF-8(Unicode変換形式8)

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

19.2 Web開発で使用されるエンコーディング:UTF-16とUTF-8

Web開発で使用されるUnicodeエンコーディング形式は、UTF-16とUTF-8です。

19.2.1 ソースコード(内部表現):UTF-16

ECMAScript仕様では、ソースコードは内部的にUTF-16として表現されます。

19.2.2 文字列:UTF-16

JavaScript文字列の文字は、UTF-16コードユニットに基づいています。

> const smiley = '🙂';
> smiley.length
2
> smiley === '\uD83D\uDE42' // code units
true

Unicodeと文字列の詳細については、§20.7「テキストの原子:コードポイント、JavaScript文字、グラフェムクラスタ」を参照してください。

19.2.3 ファイル内のソースコード:UTF-8

HTMLとJavaScriptは、現在ほとんどの場合UTF-8でエンコードされています。

たとえば、HTMLファイルは現在通常このように始まります。

<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
···

Webブラウザで読み込まれるHTMLモジュールの場合、標準エンコーディングもUTF-8です。

19.3 グラフェムクラスタ – 真の文字

世界のさまざまな文字体系を考慮すると、文字の概念は非常に複雑になります。そのため、「文字」をある意味で表すいくつかの異なるUnicode用語があります。コードポイントグラフェムクラスタグリフなどです。

Unicodeでは、コードポイントはテキストの原子単位です。

しかし、グラフェムクラスタは、画面または紙に表示される記号に最も近いものです。「水平方向に分割可能なテキスト単位」として定義されています。そのため、公式のUnicodeドキュメントでは、ユーザーが認識する文字とも呼ばれています。グラフェムクラスタをエンコードするには、1つ以上のコードポイントが必要です。

たとえば、デーバナーガリー文字のkshiは4つのコードポイントでエンコードされています。Array.from()を使用して文字列をコードポイントを含む配列に分割します(詳細は、§20.7.1「コードポイントの操作」を参照してください)。

Splitting the grapheme cluster for the Devanagari _kshi_ into code points.

国旗の絵文字もグラフェムクラスタであり、2つのコードポイントで構成されています。たとえば、日本の国旗などです。

Splitting a flag emoji into code points.

19.3.1 グラフェムクラスタとグリフ

記号は抽象的な概念であり、書かれた言語の一部です。

概念とその表現の区別は微妙であり、Unicodeについて話す際には曖昧になる可能性があります。

  グラフェムクラスタの詳細情報

詳細については、Manish Goregaokarによる“Let’s Stop Ascribing Meaning to Code Points”を参照してください。

  クイズ

クイズアプリを参照してください。