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




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

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

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

コンピュータの仕組み【文字コード】
コンピュータの仕組み【文字コード】 私たち人間は、 数字(10進数:0 ~ 9) 文字・・・ 日本人なら 平仮名(あ ~ ん) 片仮名(ア ~ ン) 漢字(日本人で全ての漢字を知っている方は少ない) ...

この文字コードとは

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

これら両方をまとめた概念的な言い方です。

この記事では

  • 符号化文字集合符号化方式の関係について
  • Unicodeについて
  • UTF-8UTF-16UTF-32について

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

スポンサーリンク

符号化文字集合と符号化方式の関係について

符号化文字集合と符号化方式の関係について

符号化文字集合符号化方式の関係について説明する前に

  • 符号化文字集合
  • 符号化方式

それぞれについての説明をしていきます。

符号化文字集合

符号化文字集合 (coded character set)、符号 (code) 文字集合を定め、かつ、その集合内の文字とビット組合せとを 11 に関係付ける、あいまいでない規則の集合


出典:JIS X 0201-1997規格票

使用する文字の範囲の事です。

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

符号化文字集合


出典:Soar365.
厳密に言うと、JISの中でも

  • JIS X 0201・・・ラテン基本文字と片仮名の文字範囲。
  • JIS X 0208・・・日本語(平仮名・カタカナ・漢字)の2バイト文字の文字範囲。

という符号化文字集合があります。

符号化文字集合では、一つ一つの文字に符号位置(コードポイント)と呼ばれる符号化方式とは異なる整数値を付けて管理しています。

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

符号位置(コードポイント)とは、符号化文字集合内の文字を整数値で表す事を指します。

換言すると、「符号化文字集合を構成する文字を並べて、頭から順番に振った数値」の事です。
この符号位置(コードポイント)は、あくまでその文字の符号化文字集合内での位置であり、符号化方式ではありません。
UnicodeとJIS X 0208の符号化文字集合内の符号位置(コードポイント) Unicodeの符号化文字集合内の符号位置(コードポイント)
UnicodeとJIS X 0208の符号化文字集合内の符号位置(コードポイント) Unicodeの符号位置(コードポイント)

符号化文字集合を構成する文字を並べて、頭から順番に振った数値」の事を符号位置(コードポイント)と呼ぶと先述しました。

この符号位置(コードポイント)符号空間(座標みたいなもの)内で、一つ一つの文字が割り振られています。

符号空間

  • ・・・多数のからなる部分集合
  • ・・・多数のからなる面状の部分集合
  • ・・・多数のからなる線状の部分集合
  • ・・・符号位置(コードポイント)の位置

で構成されています。

Unicode(UCS-4)の構造

基本多言語面(Basic Multilingual Plane, BMP)・・・
ISO/IEC 10646の第0群第0面およびUnicodeの第0面。

符号空間は1次元のこともあれば、多次元のこともあります。
その中の符号位置(コードポイント)は、座標に相当する整数列で特定されます。

符号化方式

符号化方式(Character Encoding Scheme、CES)とは、符号化文字集合で文字に対応付けた整数値を、実際にコンピュータが利用できるデータ列(通常、バイト列)に変換し符号化(エンコーディング:Encoding)する方式。

例1)JIS X 0208符号化文字集合内の符号位置(コードポイント)【4区2点】をShift_JISという符号化方式で符号化(エンコーディング:Encoding)して【0x82A0】というバイト列に変換するという事。

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

符号化方式

符号化方式には

  • Shift_JIS
  • EUC-JP(Unix系OS)
  • ISO-2022-JP
  • UTF-8
  • UTF-16 等々

多種存在します。

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

符号化文字集合符号化方式の関係は図にしてみると分かりやすいです。

Unicodeの概念


出典:Soar365.

Unicodeについて

Unicodeについて

Unicodeとは、世界中の文字を扱えるようにした符号化文字集合の事です。

符号位置(コードポイント)で説明したように、Unicodeの中の一つ一つの文字に 符号位置(コードポイント)を付けて管理していています。

Unicode符号位置(コードポイント)を全て表現する為に、

  • ・・・8 bitのデータ幅
  • ・・・8 bitのデータ幅
  • ・・・8 bitのデータ幅

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

以前は「」の上に「」という分類もありましたが、

  • Unicodeの上限がU+10FFFF
  • 常に「」0しか存在せず

不要になり、現在ではという用語は廃止されました。

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

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

Unicodeの基本多言語面(BMP)の構造

UTF-8・UTF-16・UTF-32について

UTF-8・UTF-16・UTF-32について

Unicodeで定義されている文字には「U+0000~U+10FFFF」(16進数表記)という符号位置(コードポイント)が割り当てられています。

これをコンピュータのデータとして扱う場合は、バイトデータに分解して 1 byteずつ順番に書き込んだり、送信したりする必要があります。

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

は、符号化文字集合であるUnicode符号位置(コードポイント)

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

で符号化した符号化方式の事です。

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

UTF-8

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

UTF-8(Unicode Encoding Forms 8)はASCIIと互換しています。

これは既存のASCII(いわゆる半角文字)にしか対応していないシステム等々でも、大きな変更なしにそのまま使えるようにするためです。

ASCIIに関してはこちらの記事

コンピュータの仕組み【文字コード】
コンピュータの仕組み【文字コード】 私たち人間は、 数字(10進数:0 ~ 9) 文字・・・ 日本人なら 平仮名(あ ~ ん) 片仮名(ア ~ ン) 漢字(日本人で全ての漢字を知っている方は少ない) ...

UTF-8 符号化方式の特徴

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

UTF-8 符号化方式


16bitの符号位置(コードポイント)を4bit/6bit/6bitの3つに分解し、3bytesのデータに変換

UTF-16

UTF-8

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

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

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

  • UTF-16
  • UTF-32

という符号化方式も用意されました。

UTF-16

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

サロゲートペア

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

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

当初のUnicodeは、

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

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

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

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

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

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

サロゲートペア


サロゲートペアに変換するには、まず符号位置(コードポイント)からU+10000を減算して 20 bitの数値に変換。
それを上下 10 bitずつに分割し、それぞれの値を

  • U+D800
  • U+DC00

加えるとサロゲートペアになります。

UTF-32

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

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

エンディアン

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

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

この場合の

  • バイトオーダー(Byte Order)
  • エンディアン(Endian)

は同義語になります。

バイトオーダー(Byte Order)・・・バイトを並べる順番のこと

エンディアン(Endian)・・・多バイト(2 bytes以上)のバイト幅を持つ整数データをメモリーに格納する際の、記録・転送方法のこと

  • ビッグエンディアン(BE)・・・データの最上位バイトから順に格納する方式
  • リトルエンディアン(LE)・・・データの最下位バイトから順に格納する方式

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

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

エンディアン

BOM(Byte Order Mark)

Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのこと。
このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用します。

UTF-8・UTF-16・UTF-32

Unicodeという符号化文字集合の中の符号位置(コードポイント)から

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

それぞれの符号化方式を使った、整数列からバイト列への変換図です。

UnicodeとUTFの違い

コメント