Unicode のサポート

Unicode 標準は、標準化文字コードの一種で、各国のテキストを表示および保管用にエンコードする目的で設計されています。 固有の 16 ビット値または 32 ビット値を使用して、プラットフォームや言語、プログラムなどに依存せず、それぞれの文字を個別に表します。Unicode を使用すると、さまざまなプラットフォームや言語、国、地域で稼働するソフトウェア製品を開発することができます。 また、Unicode を使用することにより、複数の異なるシステムを介してデータを転送することもできます。

コンパイラーおよびランタイムから使用できる Unicode サポートには、2 種類の形式があります。このセクションでは、この 2 種類の Unicode サポートについて説明すると共に、各サポートのフィーチャーや、サポート使用時の考慮事項についても触れます。 Unicode 関する追加情報を参照するには、Unicode ホーム・ページ (英語) (www.unicode.org) にアクセスしてください。

1 つ目の Unicode サポートは、UCS-2 サポートです。 コンパイル・コマンドで LOCALETYPE(*LOCALEUCS2) オプションを指定すると、コンパイラーおよびランタイムは、2 バイトの Unicode 文字を表すワイド文字 (wchar_t タイプの文字) およびワイド文字ストリング (wchar_t * タイプのストリング) を使用します。ナロー (非ワイド) 文字およびナロー文字ストリングは、UCS-2 サポートが有効でない場合と同様に、EBCDIC 文字を表します。 Unicode 文字は、CCSID 13488 でコード・ポイントを表します。

2 番目のタイプの Unicode サポートは、UTF-8/UTF-32 サポートです (UTF サポートとも呼ばれます)。 コンパイル・コマンドで LOCALETYPE(*LOCALEUTF) オプションを指定すると、コンパイラーおよびランタイムは、4 バイトの Unicode 文字を表すワイド文字およびワイド文字ストリングを使用します。各 4 バイト文字は、UTF-32 の 1 文字を表します。 ナロー文字およびナロー文字ストリングは、UTF-8 文字を表します。 各 UTF-8 文字のサイズは、1 バイトのものから 4 バイトのものまであります。 通常文字の大部分は、1 バイトのサイズです。 実際には、7 ビットの ASCII 文字は、すべて UTF-8 に直接マップされて、そのサイズは 1 バイトになります。 UTF-8 文字は、CCSID 1208 でコード・ポイントを表します。

UTF サポートを有効にすると、ワイド文字が UTF-32 Unicode になるばかりでなく、ナロー文字も UTF-8 Unicode になります。 次の HelloWorld プログラムを例に、説明します。
#include <stdio.h>

int main() {    
   printf("Hello World\n");    
   return 0; 
}
このプログラムを UTF サポートによってコンパイルすると、EBCDIC 文字ではなく、UTF-8 文字として、文字ストリングがプログラム内に格納されます。 printf() 関数はこのことを認識し、UTF-8 文字を構文解析して、意図に沿った出力を生成します。 しかし、UTF-8 文字の処理方法を理解しないユーザー提供の関数などが、このプログラムによって呼び出された場合、他の関数でも誤った結果が出力されるか、誤った振る舞いが行われることになります。