Unicodeとは?UTF-8・UTF-16・UTF-32の違い

Unicodeとは?UTF-8・UTF-16・UTF-32の違い




Unicodeとは?UTF-8・UTF-16・UTF-32の違い

インターネットが世界中で普及している現代では、世界中のコンピュータが相互にデータを授受できるように、文字コードの統一が必須です。

そこで,考案されたのがUnicode(ユニコード)と呼ばれるコード体系です。

UnicodeはISO(国際標準化機構)規格となり、国際的に認められています。

文字コードに関する記事はこちら

文字コードとは?コンピュータの文字コードの種類
文字コードとは何かご存知ですか。また、コンピュータがどのように電気信号を扱い、文字・音・色を認識しているかご存知ですか。この記事では、2進数しか扱えないコンピュータがどのように文字・音・色を認識しているか、文字コードを符号化文字集合・符号化方式に分けて説明しています。

この記事では

  • Unicode
  • UTF-8・UTF-16・UTF-32の違い

それぞれ説明していきます。

Unicode

Unicode

Unicodeとは、世界中の文字を扱えるようにしたISO(国際標準化機構)規格の文字集合の事を指します。

文字集合とは、

  • コンピュータが認識出来る文字の範囲の事
  • 文字コードを区別する2段階の一つ

です。

文字コードは

  • 符号化文字集合(character set)
  • 符号化方式(character encording scheme)

と2段階に区別する事が出来ます。

Unicode以外の文字集合には

  • JIS・・・平仮名・カタカナ・漢字、ラテン基本文字、記号 等々
  • KS・・・ハングル文字、ラテン基本文字、記号 等々

があります。

符号化文字集合


出典:Soar365.

文字集合では、それぞれの文字に対応したビット値があります。

文字集合の文字に対応したビット値は、符号位置(コードポイント)と呼ばれています。

符号位置(コードポイント)は、

  • 文字集合を構成する文字を並べて順番に振った数値
  • あくまで、その文字の文字集合内での位置

であり、符号化方式とは別物です。

Unicodeの符号位置(コードポイント)の一例です。

文字コードポイント
1U+0031
AU+0041
U+3042
U+4E08

同じ文字でも文字集合が違えば、符号位置(コードポイント)も違います。

 UnicodeJIS X 0208
「1」の符号位置(コードポイント)U+00313区1点16
「A」の符号位置(コードポイント)U+00413区1点32
「あ」の符号位置(コードポイント)U+30424区2点0

Unicodeの符号位置(コードポイント)は、

  • 面・・・8 bitのデータ幅
  • 区・・・8 bitのデータ幅
  • 点・・・8 bitのデータ幅

合計24bitのデータ幅を利用しています。

Unicode(UCS-4)の構造

コード位置名称、用途
第0面U+0000~U+FFFF・基本多言語面(Basic Multilingual Plane:BMP)
・現在よく使われている欧米のアルファベットやCJK漢字コードなどが割り当てられている。最初のUnicode規格で制定されていた領域
・この面のコードは16bit以内で表現できるため、コード効率がよい
第1面U+10000~U+1FFFF・追加多言語面(Supplementary Multilingual Plane:SMP)
・現在ではあまり使われていない古代の文字や、顔文字などの記号類を収容
第2面U+20000~U+2FFFF・追加漢字面(Supplementary Ideographic Plane:SIP)
・人名でしか使わないような、使用頻度の低い漢字などを収容
第3面U+30000~U+3FFFF・第三漢字面(Tertiary Ideographic Plane:TIP)
・甲骨文字などの古代文字を収容する予定の領域
第4~13面U+40000~U+ DFFFF(未使用)
第14面U+E0000~U+EFFFF・追加特殊用途面(Supplementary Special‐purpose Plane:SSP)
・言語タグや異体字セレクタなどを収容
第15面U+F0000~U+FFFFF・私用面(Private Use)
・外字などで使用できる
第16面U+100000~U+10FFFF・私用面(Private Use)
・外字などで使用できる
 基本多言語面(BMP)の構成
0 〜 33・ラテン、ギリシャ、キリル、ヘブライ、アラビア等
・インド系文字群等
・記号類
・平仮名・片仮名等
34 〜 4DCJK統合漢字拡張A
4E 〜 9FCJK統合漢字
A0 〜 A4イ文字
A5 〜 AB
AC 〜 D7ハングル
D8 〜 DFサロンゲート領域
E0 〜 F8私用領域
F9 〜 FACJK互換漢字
FB 〜 FEアラビア文字表現形等
FE 〜 FF全角・半角形

UTF-8・UTF-16・UTF-32の違い

UTF-8・UTF-16・UTF-32の違い

  • UTF-8
  • UTF-16
  • UTF-32

とは、文字集合であるUnicodeから符号化(エンコーディング:Encoding)する符号化方式の種類です。

符号化方式(Character Encoding Scheme、CES)とは、文字集合の符号位置(コードポイント)を、実際にコンピュータが利用できるデータ列(通常、バイト列)に変換し符号化(エンコーディング:Encoding)する方式の事を指します。

Unicodeの符号位置(コードポイント)「U+0000~U+10FFFF」(16進数表記)から

  • 8 bit単位
  • 16 bit単位
  • 32 bit単位

で符号化した符号化方式が

  • UTF-8
  • UTF-16
  • UTF-32

になります。

文字コードポイントUTF-8UTF-16UTF-32
1U+00313100 3100 00 00 31
AU+00414100 4100 00 00 41
U+3042e3 81 8230 4200 00 30 42
U+4E08e4 b8 884e 0800 00 4e 08

例えば、UnicodeをUTF-8で符号化(エンコーディング:Encoding)する場合、

  1. 符号化文字集合内の符号位置(コードポイント)【U+3042】を
  2. UTF-8という符号化方式で符号化(エンコーディング:Encoding)して
  3. 【0xE38182】というバイト列に変換

コンピュータが利用できるデータ列に変換します。

文字集合「あ」の符号位置(コードポイント)符号化方式バイト列
UnicodeU+3042UTF-8

→ → → → →
(エンコード:符号化)
0xE38182
UTF-8

← ← ← ← ←
(デコード:復号化)

符号化文字集合と符号化方式の関係は以下の図のようになっています。

符号化文字集合と符号化方式の関係


出典:Soar365.

UTF-8

UTF-8(Unicode Encoding Forms 8)は、符号位置(コードポイント)の値によって長さが1 ~ 4bytesに変化する可変長の符号化方式です。

UTF-8の特徴は

  • 最も頻繁に使われる(U+0000 ~ U+007F)の文字(ASCII文字/半角英数字)は1byteに収まり、コード効率が高い
  • ラテン圏でよく使われる文字範囲(U+0080 ~ U+07FF)は2bytesで済み、コード効率が良い
  • 基本的な漢字はほぼ基本多言語面(BMP)(U+0000 ~ U+FFFF)に収容されており、ほとんどの日本語文字は3bytes

例えば、16bitの符号位置(コードポイント)は、

  • 4bit
  • 6bit
  • 6bit

の3つに分解し、3bytesのデータに変換されます。

UTF-8 符号化方式

UTF-16

UTF-8は

  • ファイルへの保存や通信等では便利
  • メモリの利用効率も高い

ですが、1byte単位の可変長データなのでプログラムから操作するには不便です。

そこで、固定長データとして符号化する

  • UTF-16
  • UTF-32

の符号化方式が用意されました。

UTF-16は

  • Unicodeの符号位置(コードポイント)を16bitで表現する方式
  • U+0000 ~ U+FFFFの範囲ならそのまま16bitデータとして格納
  • U+10000 ~ U+10FFFFの符号位置(コードポイント)はサロゲートペアを使って表現

という特徴を持つ符号化方式です。

サロゲートペア

サロゲートペア(surrogate pair:代用対)とは、Unicodeに第1面(SMP)以降を追加したときに導入された新しい符号化方法です。

16bit幅の符号位置(コードポイント)を2つ使い、U+10000 ~ の文字を表現します。

当初のUnicodeは、

  • 符号位置符号位置(コードポイント)を全て16bitで表現
  • 1文字当たり16bit幅の変数が1つあればUnicodeの符号位置(コードポイント)を収容

していましたが、U+10000 ~ の符号位置(コードポイント)ではこれは不可能です。

そこで、16bit × 2 ペアで全ての符号位置(コードポイント)を扱う方法(サロゲートペア)が考案されました。

基本多言語面(BMP)の未使用領域にあった符号位置(コードポイント)の内、

  • U+D800 ~ U+DBFF(1024文字分)
  • U+DC00 ~ U+DFFF(1024文字分)

これらのペアを使って、1024 × 1024 = 約100万文字分のコード領域を確保し、これを U+10000 ~ U+10FFFFに割り当てました。

サロゲートペアへの変換は、

  1. 符号位置(コードポイント)からU+10000を減算
  2. 20bitの数値に変換
  3. それを上下10bitずつに分割
  4. それぞれの値に
    • U+D800
    • U+DC00

    を加算

という手順を踏みます。

サロゲートペア

UTF-32

UTF-32は、サロゲートペアを使わずに、常に32bitでUnicodeの符号位置(コードポイント)を表現する符号化方式です。

基本多言語面(BMP)以外のUnicodeの符号位置(コードポイント)が使われることは非常に少ないため、実際にはほとんどの場合は上位 16bitがゼロになり、メモリの利用効率はあまり良くありません。

エンディアン

UTF-16やUTF-32では、2bytes(16bit)もしくは4bytes(32bit)で1つの文字コードを表現しています。

このようなデータをメモリ上に格納したり、ファイルに保存したりする場合は、その「バイトオーダー(エンディアン)」属性について考慮する必要があります。

この場合の

  • バイトオーダー(Byte Order)・・・バイトを並べる順番
  • エンディアン(Endian)・・・多バイト(2bytes以上)のバイト幅を持つ整数データをメモリーに格納する際の、記録・転送方法

は同義語になります。

Unicodeで符号化されていることおよび符号化の種類の判別の為に、BOM(Byte Order Mark)が使用されます。

BOMは、Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのです。。

  • ビッグエンディアン(BE)・・・データの最上位バイトから順に格納する方式
  • リトルエンディアン(LE)・・・データの最下位バイトから順に格納する方式
BOM(Byte Order Mark)リトルエンディアン(LE)ビッグエンディアン(BE)
UTF-16のFF FEFF FEFE FF
UTF-32のFF FE 00 00FF FE 00 0000 00 FE FF

「U+29E49」というUnicodeの符号位置(コードポイント)を、

  • UTF-32 ビッグエンディアン(BE)でメモリに格納すると「00 02 9E 49」という順
  • UTF-32 リトルエンディアン(LE)だと「49 9E 02 00」という順

になります。

UTF-8・UTF-16・UTF-32

  • UTF-8
  • UTF-16
  • UTF-32

の違いは、Unicodeという符号化文字集合の中の符号位置(コードポイント)からビット列からコンピュータが認識出来るバイト列へ変換する符号化方式にあります。

UnicodeとUTFの違い


出典:Qiita QUANON

以上が、

  • Unicode
  • UTF-8・UTF-16・UTF-32の違い

それぞれの説明になります。

コメント

  1. […] 参考 UnicodeとUTF-8・UTF-16・UTF-32の違いとはYone's archive SHARE […]