(cache) ユニコード
ユニコード(Unicode)

 現在,私たちはコンピュータでワープロ等を使用する場合,入力の問題を別にすれば,日本語を特に意識しないで使うことができます。しかし実は日本語に限らず,アルファベットや数字などもコンピュータで使うためには,コンピュータ内部ではいくつかの仕組みが必要です。ただ日本で販売されているコンピュータは日本語を使えるような仕様で作られていますから,日本語だけを使用している場合は特に意識する必要はありません。
 しかし,いくつかの言語を使う場合は,それらの仕組みを意識する必要があります。例えば,中国語やハングルなどを使った文書を取り扱う場合,それに対応した処理を考えないといけません。元々は,それぞれの言語に従って,それぞれの方式があり,それぞれを切り替えながら 利用することになります。しかしそのように利用するにしても,各ソフトウエアがそれに対応する仕組みを持たなければそれを利用することはできません。

例えば,Tiny Basic for Windows でも,Ver. 1.17までは,

 Print "你好"

と入力して実行しても,画面には

?好

 と表示されます。これはTiny Basic for Windowsが日本語対応ソフトで,日本語の漢字でない "你" の文字を正しく扱えないことに依ります。

 現在世界は国境を越えての情報交換が頻繁に行われています。これから益々複数の国の文字を扱う必要性が高まってきています。この問題に対応するために世界中の文字を同時に扱う仕組みが求められていました。これの一つの解決策がユニコードでした。ユニコードは世界中の文字を一つの仕組みの中で表す試みです。この方式を利用すれは一つのプログラムの中に色々な言語混在して利用できるようになります。

例えば,ユニコード対応になったTiny Basic for Windows では,

 Print "你好! 안녕하십니까 세계! Hello World こんにちは "

と入力して実行すると,画面には

你好! 안녕하십니까 세계! Hello World こんにちは

と正しく表示されます。これはTiny Basic for Windowsがユニコードに対応していることに依ります。

  • コンピュータで文字を扱うには対応する仕組みが必要
  • 元々は各言語ごとその仕組みが考えられていた。
  • それらを統一して利用できる方法として考えられたのがユニコード

と言えるでしょう。

 ここでは日本語とユニコードについて簡単にまとめます。

 ユニコードについての詳細で正確な理解は,ユニコード規格の本家
The Unicode Consortium
を参照してください。

符号化文字集合

 コンピュータで文字を使用する場合,その文字集合を確定する必要があります。また文字集合を決めたとき,その集合に含まれる各々の文字を対応させる方法を決める必要もあります。このように,文字とその対応方法を決めた集合を符号化文字集合と言います。

 日本語での符号化文字集合としては,JIS X 0201 や JIS X 0208(JIS 基本漢字),JIS X 0213(JIS 拡張漢字) などがあります。現在のPCの最新OSではこのJIS X 0213がサポートされています。

 ユニコードの符号化文字集合
 ユニコードの符号化文字集合は世界中の国々の符号化文字集合を集めたものと言えますが,その対応方法(符号化,番号付け)は元々の国のものと異なります。現在の最新のユニコード規格では,JIS X 0213 の文字を含んでいますが,文字の対応方法はユニコードでのものが採用されており,JIS の方法とは異なります。まとめると,

  1. 日本語の符号化文字集合はJIS X 0213が最新。
  2. ユニコードでも,その文字を使うことができる。

となります。

文字符号化方式

 符号化文字集合に対して,実際のコンピューターでそれらの文字を表示する方法は一通りではありません。日本語の場合,JIS符号化,シフトJIS符号化,EUC符号化の3方法があります。JIS X 0213 でもそれぞれの符号化方式について規定しています。符号化方式は,コンピューターでの具体的な取扱い方法ですので,コンピューター内部のみでなく,ファイル形式も規定します。ですから,例えば,同じ文字でも,JIS符号化で表現されたファイルと,シフトJIS符号化で表現されたファイルは,実際にフィルに記録される内容が異なります。ですから,日本語を正しく取り扱うためには,それぞれその符号化法に対応した処理ができなければなりません。そうでないと正しく読み取ることや,処理することもできません。
 文字化けの現象は符号化方式の不対応から起きます。まとめると 

日本語の文字符号化方式は
JIS,シフトJIS,EUC
の3種類。

となります。 

ユニコード(Unicode)

 ユニコードは世界中の文字を一つの体系で表そうとしていますから,ユニコードの符号化文字集合は世界中の文字を含んでいます。その結果,かなり大きなものです。欧米で使われているラテン文字はもちろん,日本語の他,ギリシア語,ロシア語,アラビア語,中国語,ハングルなどが含まれています。1991年にバージョン1.0.0 が発表された時は,7161個の文字が登録されていましたが,その後バージョンが上がるにつれて,文字が増え,2006年にバージョン5.0になった時は,99089文字が登録されました。2009年10月現在,バージョン5.2 で,107361個の文字が登録されています。近い将来携帯で使われている絵文字も登録されるようです。

 ユニコードの符号化文字集合は,16進数で番号付けされています。文字はその番号に U+ を付け加えて表すことになっています。例えば,672C番目の文字は,U+672C と表します。
 ユニコードは最初は16ビットで番号付けされました。16ビットは4ケタの16進数ですから,U+0000から U+FFFFと表される訳です。例えば,"日"という文字は,26085番目の文字として登録されています。これを16進数として表すと, 65E5 でから,U+65E5 となります。
 日本語漢字はCJKというグループとしてまとめられています。CJK は中国,日本,韓国を意味していますので,このグループには,日本語以外の漢字も含まれています。
 例えば,U+4E00 から CJK漢字が登録されていて,

U+4E00
U+4E01
U+4E02
U+4E03
U+4E03
・・・  

となっています。
 16ビットで表される数は,2^16=65536ですが,上の表示法では,
U+0000 ~ U+FFFF
と表されますが,これでは明らかに不足です。そこで,1996年にユニコードがバージョン2.0になった時,拡張され,U+20B9F のような文字も登録されています。U+0000 ~ U+FFFFを基本領域(基本多言語面),U+10000以上を拡張領域と言われています。まとめると

ユニコードは
U+0000,・・・,U+E0FFF
のように番号付けされた多国語文字の集まり。
U+0000 ~ U+FFFF を基本領域
U+10000 ~ U+10FFFF を拡張領域
と言う。

となります。 


ユニコードの文字符号化方式は主として3種類あります。

  1. UTF-32
  2. UTF-16
  3. UTF-8

です。(ここで UTF はUnicode Transformation Format を意味します。)それぞれ,UTF-32は,32ビットを使ってユニコード文字を表し,UTF-16は,16ビットを使い,UTF-8は8ビットを使います。U+10000以上の文字は,16ビットでは表せませんから,UTF-16では,2組の16ビットを使って一文字を表します。ですから,UTF-16では,一文字を表すに必要なメモリーは固定されていません。16ビット1個の場合と,16ビット2個の場合があります。UFT-8は,8ビット1個から4個を使って表します。
 ユニコードはもともと,16ビットで世界中の文字を表す試みとして始まり,後にその不足を補うために,それ以上のビットを使うことになりました。ですから,16ビットの領域に実は殆んど普通に使う文字は含まれています。ですから,UTF-16で表した場合殆んどの文字が16ビット1個で表されます。逆に,UTF-32で表した場合,殆んど32ビットの半分16ビットで間に合うのに,32ビット1個を使うことになります。UFT-32が文字の取扱いは便利で簡単ですが,使用するメモリー領域がほぼ倍必要となります。これに対して,UTF-16は,多少の面倒な部分はありますが,比較的効率的なメモリー使用になります。
 このことから,現在のコンピューターでは内部的にはUTF-16を使うことが多くなっています。実際,Windows NT系列では UTF-16が昔から使われていました。現在普通に使われているWindows系のOSは,Windows Server,XP,Vista,Windows 7ですがこれらはすべてNT系です。まとめると 

ユニコードの文字符号化方式は主として
UTF-32,UTF-16,UTF-8
の3種類。
現在のWindowsでは内部的にはUTF-16が使われている。

となります。 

結合文字

 ユニコードは世界中の文字を表すことを目的としていますので,結合文字という特別な文字の扱いがあります。例えば,

と言う字は,「か」に濁点「゙ 」という風に言います。つまり「が」は「か」に「゙ 」で合成されると考えられます。

「か」はU+304Bですし,実は, 「゙ 」はU+3099 というユニコード文字です。これらを合わせると,「が」が合成されます。つまりこの場合,

が = か +゙

となります。ここで,「か」を基底文字,「゙ 」を結合文字,今の場合「が」を合成済み文字といいます。日本語に関連した結合文字は,「゙ 」や「゚ 」などがあります。欧米語では,「́」や「̂」などあります。

 これはこれで良いのですが,関連して少し困った状況が存在します。実は,例えば,上の「が」は結合文字を使って2文字で表すことになりますが,この文字の作り方とは別に「が」という文字がユニコードに登録されています。U+304C は一文字「が」を表します。このように結合文字を使って合成された文字の多くが,一文字として別に登録されています。つまりそれらは,文字としての表し方が,ユニコードとして2種類あることになります。

 文字列を比較して処理をするときは,基本的にはユニコードのコード番号で処理しますから,この状況では正しく処理されないことになります。例えば「が」を検索する場合,U+304B とU+3099 として検索すれば,U+304Cで表されている「が」は見つからないことになります。

 この状況に対応するため,ユニコードでは,正規化(normalize)という概念があります。これは,文字列を表す標準的な形式を定めておき,その形に変換してから処理をするというものです。この正規化の形式もまず次の2種があります。

  • D型正規化形式  (Normalization Form D (NFD))
  • C型正規化形式  (Normalization Form C (NFC))

D型正規化形式は,結合文字などで表されるものを,結合文字を使って分解します。C型正規化形式  はその文字を結合された等価な文字に合成します。例えば

元の文章   :「に」「っ」「ほ」「゚ 」「ん」「じ」「ん」

D型正規化形式:「に」「っ」「ほ」「゚ 」「ん」「し」「゙ 」「ん」

C型正規化形式:「に」「っ」「ぽ」「ん」「じ」「ん」

となります。この他の正規化として

  • KD型正規化形式  (Normalization Form KD (NFKD))
  • KC型正規化形式  (Normalization Form KC (NFKC))

というものもあります。これは,等価の文字ではなくで互換文字についての正規化です。互換とは,実質同じ意味の文字という意味で,例えば,日本語では

「1」(全角文字1)と「1」(半角文字1)

などが対応します。まとめると,

  • ユニコードには文字によっては分解や合成がある。
  • その為の結合文字がある。(濁点やアクサンなど・・・)
  • 文字列の標準形として正規化という概念がある。

となります。 

フォント

 ユニコードは文字を表す一つの仕組みですが,実際にコンピューターの画面に文字を表示するためには,対応する文字の形が必要です。それがフォントです。コンピューターで文字を表示する場合,文字コードを利用するフォントに対応させます。当然ですが同じ文字でもフォントが違えば,文字の形は微妙に異なります。例えば,「日本」という文字も

MS明朝 日本
MSゴシック 日本
メイリオ 日本

のように使うフォントによって形が異なります。上にフォントは日本語フォントですが例えば中国語の漢字を表すにはこれらのフォントでは表すことができません。例えば

𠮿

という文字は日本の文字にはありませんので,対応するフォントが無ければ表示はできません。この文字を表示するには,"MingLiu" などの中国語漢字用フォントが必要になります。ワープロなどでは,フォントの判定をソフト側で行い必要なフォントがコンピューターにインストルされているれば,それを利用して表示します。しかし,エディターなどではそれに対応していないのが普通ですので,ユーザー側でとくに指定しなければ

と表示されてしまいます。

まとめると,

  • ユニコードで対応する文字があってもフォントが正しく設定されていなければ表示されない。
  • ワープロの場合,フォントの切り替えを自動的に行うので,対応するフォントがインストールされていれば,表示できることが多い。
  • エディターなどでは,自動変換は行われないのが普通。

となります。 


まとめ

 現在の私たちは,一つの国に閉じて生活をしている訳ではなく,世界中の多くの国々と交流をして生活をしています。そしてこの傾向は進むことはあれ,後退することはないでしょう。ですから,色々な国々について,各国々の特徴を尊重しながら,それらを統一的な方法で扱うことができれば大変便利で効率的でしょう。コンピューターでの文字の取扱いについてのその試みの一つがユニコードです。
 歴史的な状況と,各国々の事情により,ユニコードは種々の問題を含んでいますが,このような試みは歴史の進化に沿ったものであることは確かです。また現在のコンピューターのOSの中にもその仕組みが既に随分以前から取り入れられています。
 最近,それがOSだけではなく,応用ソフトも対応が進みつつあります。このような中で,コンピューター利用者にとっても,ユニコードの理解は避けて通れない事柄でしょう。

まとめると,

  • ユニコードはコンピューター進化の方向に沿った試み。
  • 一般のコンピューター利用者もこれからは,ユニコードの理解を避けて通れない。

となります。