2009年06月15日

閑話休題その1 国際対応プログラミング〜UNICODE〜

2009年現在、UNICODEというものが徐々に浸透しつつあります。
WindowsでもWindows2000から完全にUNICODEに対応し、
WindowsVistaやWindows7で、標準的な位置づけになっています。
これからプログラミングを行う上で、UNICODEを考慮することは
必須条件であり、特に日本語というコンピュータで扱いにくい言語を
取り扱うためには、避けられないものです。


それでは、文字列がどのように処理されているのか
見ていくことにしましょう。

C言語では文字列を次のように取り扱います。

char str[256] = "ABC日本語もオッケー";


char型は1バイトの整数です。
これを1文字として、その配列で基本的には表現されています。
ANSI(ASCII)(※1)では、'A'〜'Z'をそれぞれ0x41〜0x5A、
'a'〜'z'を0x61〜0x7Aに割り当てています。(ShiftJISでも同様です)
全角文字や特殊文字などは、2バイトを使用して表現されています。
ShiftJIS(※2)では、1バイト目に0x81〜0x0x9Fと0xE0〜0xEFまで使われ、
2バイト目に0x40〜0xFC(0x7F除く)までが割り当てられています。

はじめ、コンピュータ発祥の英語圏などではアルファベット26文字と
数字やいくつかの記号しかなく、1バイト(256種類)を
1つの文字として割り当てられていたのですが、
のちに日本語などを表現する上で、漢字など膨大にある文字を1バイトで
表現する手段がなく、2バイトに拡張していったという経緯があります。

上記str配列には1バイト文字と2バイト文字の混在状態になっています。
この混在している状態というのが厄介で、例えば

str[4] = 'D'; // 文字化けする


このようにしてしまうと、たちまち文字化けしてしまいます。
アメリカ製のプログラムで、日本語が使用できないのは、
このあたりの考慮がされていないことが、原因のひとつです。

このようなタイプの文字コードの代表は次のとおりです。

ANSI(ASCII)アメリカ圏で古くから使われている
ShiftJIS  日本語圏のWindowsで主に使われている
EUC    日本語圏のUNIX(Linux)で主に使われている
その他、国ごとに文字コードが存在する




脱線しますが、文字化けの原因としてもうひとつに
WindowsとUNIX(Linux)間での改行文字の持ち方の違いがあります。

UNIX(Linux)
"1行目です\n2行目です"

Windows
"1行目です\r\n2行目です"


Windowsでは、\rすなわち、キャリッジリターンが含まれます。
UNIX(Linux)では、キャリッジリターンは不要です。
この違いにより、WindowsのファイルをLinuxなどに転送した場合
文字化けすることがあります。


さて、国ごとに文字コードが違い、取り扱い方も違うので
複数の言語に対応することが困難になったことから
策定されたのがUNICODEという規格です。
基本的な考え方として、全ての文字を2バイト(※3)として扱い、
文字に使用できるコードを多くしたという点です。

このようなタイプの文字コードの代表は次のとおりです。

UTF-8   LinuxやMac OS Xなどの標準文字コード
UTF-16 Windowsなどで多く使われている



C言語で表現すると次のようになります。

wchar_t str[256] = L"ABC日本語もオッケー";


wchar_t型は2バイト整数です。
この2バイト整数の配列として文字列を表現しています。
これにより、さきほどの問題が解決されることになります。

str[4] = L'D'; // 文字化けしない


ちなみにLは2バイト文字列を指定するためのプレフィックスです。

また、C標準関数なども、2バイト文字列に対応するものを
使用しなくてはなりません。
例えば、次のようになります。

(非UNICODE)
char str[256] = "文字列の表示です";
printf( "%s" , str );

(UNICODE)
wchar_t str[256] = L"文字列の表示です";
wprintf( L"%s" , str );



プログラムを行う上で、以上のことを考慮すれば、
国際的に対応したプログラムを作成することが容易となります。
変数の持ち方や、関数の変更など、
既存のプログラムを修正するのは非常に困難なため、
新たに作成するプログラムは、はじめからこれらのことを
考慮したほうが、スムーズに保守することができます。



(※1)
ANSI(American National Standards Institute)
米国規格協会
アメリカにおける工業分野の標準規格

(※2)
JIS(Japanese Industrial Standards)
日本工業規格
日本における工業分野の標準規格

ANSIもJISもその国の標準規格で、
国際的な規格としてはISOなどがある。

(※3)
しかし、それでも足りず、Unicode 2.0以降では
さらなる拡張が行われている。



(参考資料)
C言語による最新アルゴリズム事典(奥村晴彦著)
技術評論社



ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。