現在ログインしていません。
新規アカウント作成
ログイン

Unicode概要

Unicode(ユニコード)はコンピューターで使用する文字の国際的な規格です。 2017年現在コンピューターの世界のデファクトスタンダードです。

古今東西世界中の文字を収録しようとしており、現時点で既にひらがな・カタカナ・漢字はもちろんエジプトの象形文字から顔文字まで幅広く収録されています。さらに拡張を続けています。

文字集合

文字集合の構造

Unicodeは65536文字を収録できる「面」という構造を持っており、全部で17面が定義されています。

そのため収録できる文字の総数は65536文字×17面=1114112文字、約110万文字ということになります。現時点ではこの3分の2程度はまだ文字が割り当てられていない状態です。

Unicode概要

第1面は基本多言語面(BMP)という名前がついており、私たちがよく使うひらがな、カタカナ、英語、数字などの文字や大部分の日本の漢字は第1面に割り当てられています。 外国でよく使う文字も第1面に割り当てられており、中国で日常使われる漢字や韓国語のハングルを含めて第1面だけ使用できればほとんどの用はたります。 日本語でもJIS第三水準の一部と第四水準漢字の一部の合計303文字は第3面(追加漢字面)に割り当てられています。

コードチャート

Unicodeに割り当てられている文字は下記サイト公開されているコードチャートと呼ばれる資料で確認できます。

Unicode 9.0 Character Code Charts

このサイトではキリル語、アラビア語、線文字B、ラテン文字など文字のカテゴリ別にpdfとして情報が公開されています。

多くの漢字はUnicodeの世界ではCJK Unified Ideographs =CJK統合漢字 というカテゴリーでまとめられています。 これは漢字が中国(China)・日本(Japan)・韓国(Korea)で統合して(Unified)用いられているためです。ベトナムも加えてCJKVと表現することもあるようですが、Unicodeの世界では用いられていません。

上記のサイトで漢字を定義しているドキュメントへのリンクを抜粋します。

この一覧ではCJK統合漢字、CJK統合漢字 拡張A、CJK互換漢字の3つが第一面(基本多言語面)に収録されています。

Unihanデータベース

Unihanデータベースを使用するとUnicodeで定義されている文字を検索できます。

http://www.unicode.org/charts/unihan.html

たとえば、「馬」を検索すると馬のコードポイントやUTF-8やUTF-16など後述するエンコード方式で表現した場合の文字コードを確認できます。

出典

コードチャートでもUnihanデータベースでも興味深いのはそれぞれの漢字の出典が記録されている点です。出典は kIRG_XSource という欄で確認できます。XにはJやGなどの文字が入り、kIRG_JSourceの場合は、日本からの出典があるという意味です。日本の出典がない場合、それは日本語ではないと考えてよいです。馬の場合はkIRG_JSourceにJ0-474Fと記載されており、日本からの出典があることがわかります。

J0は日本の規格JIS X 0208と指し、これはJIS第1水準、第2水準を定義しているものです。[1]つまり、Unicodeの「馬」は日本のJIS第1水準の「馬」に対応しているということがわかります。

このように整理された情報が公開されていますので、いわゆるJIS漢字とUnicodeのマッピングは自分で調べることができます。ただし量は多いので網羅的に調べるには時間がかかります。 公開されているPDFをJ0やJ1などで検索してみると日本のJIS第1水準と第2水準の漢字はすべてUnicodeの第1面(基本多言語面)に収録されていることがわかります。

文字コード

Unicodeのそれぞれの文字にはコードポイント(符号位置)と呼ばれる16進数の番号が割り当てられており、コードポイントは U+ を付けてU+9999 という形式で表現します。 たとえば、「あ」のコードポイントは U+3042、「仙」のコードポイントは U+4E59 です。どの文字にどのコードポイントが割り当てられているかは上記のリンクから確認できます。

第1面の文字はすべて16進数で4桁で表現できます。これは第1面のコードポイントが2バイトであることを意味します。一方、第2面以降は16進数5桁で表現します。このようにUnicodeの文字のコードポイントのサイズは文字によって異なります。

エンコード方式

UCS-2

コードポイントをそのまま使ってエンコードされた文字を表すエンコード方式が以前は一般的だったようで、古いソフトウェアでファイルを読み書きするときの文字コードの名前として「Unicode」と記載されているものはこの方式を指していることが多いようです。 もともとUnicodeは第1面しかなかったため、コードポイントをそのままエンコードされた文字コードとして扱うと2バイトの固定長となりいろいろとコンピューターの処理に都合がよいという算段だったようです。 第1面のみに限定して、コードポイントをそのまま使って文字を読み書きするエンコード方式をUCS-2と呼びます。

UTF-16

UCS-2は第2面以降の文字を扱うことができませんが、Unicodeに第2面から第17面が追加されたときにUCS-2を拡張して第2面以降の文字も扱えるようにしたUTF-16というエンコード方式も制定されました。

UTF-16は1つのコードポイントは2バイトという固定幅を維持しつつ、第2面以降の文字を表現できるようにするためにサロゲートと呼ばれる制御文字を導入しています。サロゲートを2つ組み合わせることで情報量が4バイトとなり、第2面以降の文字を表すという仕組みです。このようにサロゲートを2つ組み合わせて1つの文字を表現するので、これをサロゲートペアと呼びます。 この結果、第2面以降の文字については1つのコードポイントが1文字を表すのではなく、2つのコードポイントが1文字を表すことになります。

VBやC#, Javaなど多くのプログラミング言語では文字の数を数えるときに実際にはコードポイントの数を数えています。そのため、文字の中に第2面以降の文字が混ざっている場合、文字の数を基準にしたプログラムが誤作動してしまう可能性があり、サロゲートペア導入時には話題になりました。現在でもサロゲートペアに対応できていないシステムは多数あるようです。

VBやC#, Javaなどの処理系はプログラム内で扱う文字をUTF-16として扱っています。

UTF-8

UTF-8はA, B, Cなどの基本的な文字の文字コードをASCII文字と同じにして互換性を持たせる目的で特別なマッピングをして文字を表現するエンコード方式です。

英語圏ではアルファベットと数字、それにいくつかの基本的な記号が扱えれば通常はことたりるため、UnicodeをASCII互換にできるということはメリットが大きかったようです。 今でもインターネットやXMLなどの世界ではUTF-8がデファクトスタンダードになっています。

ただし、UTF-8で文字を扱うにはUnicodeのコードポイントから特別な計算をしてUTF-8の文字コードを算出したり、その逆を行う必要があるためUTF-16に比べて余分な計算が発生します。互換性が必要なくコンピューターの計算能力の方が重要なシーン(たとえば、プログラミング言語のランタイムやデータベース製品)ではUTF-16の方が採用されるようです。

参考

  1. ^ http://www.unicode.org/reports/tr38/index.html#kIRG_JSource