文字セット
アプリケーション コードの多国語対応 への移動
Windows NT 以降、すべての Windows で Unicode(UTF-16 エンコード)が使用されています。Delphi では、UTF-16 でエンコードされた文字はワイド文字として表されます。
欧米版 Windows(英語版、フランス語版、ドイツ語版など)の旧バージョン(Windows 95/98/Me)では ANSI Latin-1 文字セットを使用しています。ただし、これらの(Windows NT 以前の)Windows の他言語版では別の文字セットを使用しています。たとえば、Windows 95 の日本語版では Shift-JIS 文字セットを使用していますが、これは日本語の文字をマルチバイト文字コードとして表します。
一般に、以下の 3 種類の文字セットがあります。
アプリケーションでは Unicode を使用することを強くお勧めしますが、多くのアプリケーションやデータ ファイルはまだ従来のコード ページに依存しています。
シングルバイト文字
シングルバイト文字セットでは、各文字がシングルバイトの数値で表されます。つまり、シングルバイト文字セットでは、各文字を 1 バイト(8 ビット)で表される数値(すなわちコード ポイント)にマップする文字エンコード方式を使用しています。コード ページは、文字セット内の文字からコード ポイントへの特定のマッピング(エンコード方式)になります。
Delphi では、シングルバイト文字は AnsiChar 型で表すことができます。
シングルバイト文字セット(またはコード ページ)はかつての(Windows NT 以前の)Windows で使用されていました。たとえば、ANSI Latin-1 文字セット(1252 コード ページ)は以前の欧米版 Windows のシングルバイト文字セットです。なお、ANSI は American National Standards Institute(米国規格協会)の頭字語です。
32 番から 127 番(下位 7 ビット)までの文字は各シングルバイト文字セットに共通で、ASCII と呼ばれる 7 ビット セットを構成します。なお、ASCII は American Standard Code for Information Interchange(米国情報交換標準コード)の頭字語です。
Windows コード ページ(通称 ANSI コード ページ)は、ASCII 値以外で各国語文字を表すシングルバイト コード ページです。 ASCII の範囲外の文字(128 番から 255 番まで)は拡張文字と呼ばれ、コード ページによって異なります。拡張文字の集合によって、コード ページで対応できる言語が決まります。これらの ANSI コード ページは以前の Windows でネイティブに使用されていますが、Windows NT 以降でもまだ使用可能です。
OEM(相手先商標製品製造会社)コード ページは、ASCII 値以外で罫線文字や句読点文字を表すコード ページです。これらのコード ページはもともと MS-DOS に使用されていましたが、まだコンソール アプリケーションのデフォルト コード ページとして使用されています。OEM コード ページはまた、以前の FAT12、FAT16、FAT32 の各ファイル システムで非拡張ファイル名に使用されています。これに対して、NTFS ファイル システムではファイル名を Unicode で格納します。
アプリケーションでは、標準ランタイム ライブラリ関数 CharToOem や CharToOemBuf を使って、Windows コード ページと OEM コード ページの間の変換を行えます。ただし、Windows コード ページと OEM コード ページのマッチングで表現できる文字は正確に一致するわけではないので、これらの関数を使用すると、データ損失のおそれがあります。
欧米版の Windows では、通常の OEM コード ページは 437 です。これはコード ページ 1252(ANSI Latin-1)とは異なります。その他の Windows ロケール(極東版 Windows など)では、OEM コード ページは ANSI コード ページと同じです。
マルチバイト文字
アジアで使用される表意文字セットでは、各言語の文字と 1 バイト AnsiChar 型の文字との単純な 1 対 1 マッピングを使用できません。これらの言語には非常に多くの文字があるため、シングルバイト文字では表現できません。
表意文字セットを扱う方法の 1 つは、各文字を 1 バイトより大きい数値(コード ポイント)にマッピングする文字エンコード方式を使用することです。このような文字はマルチバイト文字と呼ばれます。マルチバイト文字セットは、標準 ANSI の範囲外の文字をエンコードする 1 つの方法となります。
マルチバイト文字セットでは、1 バイトで表される文字もあれば、2 バイト以上(2、3、4 バイト)で表される文字もあります。
マルチバイト文字セットのエンコード方式が多数考案されています。たとえば、Shift-JIS 文字セット(コード ページ 932)は日本語用の文字エンコードです。Shift-JIS では、文字は 1 バイトまたは 2 バイトのコード ポイントで表されます。このような文字から成る文字列は、可変幅エンコード文字のシングルバイト文字列です。
マルチバイト文字セット(MBCS)とは、シングルバイト文字列にエンコードされるコード ページを記述するのに使用される用語です。このようなエンコードには通常、下位互換性のために用意されているシングルバイト文字があります。マルチバイト文字の第 1 バイトはリード バイトと呼ばれます。一般に、マルチバイト文字セットの下位 128 文字は 7 ビット ASCII 文字にマッピングされ、順序値が 128 以上のバイトはすべてマルチバイト文字のリード バイトになります。そのため、どのようなマルチバイト エンコード(2 バイト以上のシーケンスが含まれているもの)を使用した文字列でも、その各バイトの解釈は、文字の並びにおける先行バイトで決まる変換状態によって異なります。したがって、文字列内の特定のバイトがシングルバイト文字を表すか、それともマルチバイト文字の一部であるかを区別する唯一の方法は、文字列を先頭から読み取り、127 より大きい値のリード バイトが見つかったとき、2 バイト以上の文字に解析することです。
アジア言語ロケールのコードを作成する際は、必ず、文字列をマルチバイト文字に解析できる関数を使ってすべての文字列操作を処理する必要があります。このため、マルチバイト文字の文字列をシングルバイト文字の文字列と同じようには処理できません。AnsiString 型など、マルチバイト文字データに適した文字列型を使用しなければなりません。
次のユニットには、文字列操作を処理する関数や文字列をマルチバイト文字に解析する関数が用意されています。
このような文字列のバイト単位の長さは、文字列の文字単位の長さに必ずしも一致しないことを覚えておいてください。マルチバイト文字の途中で切断して文字列を切り詰めないように注意してください。関数や手続きにパラメータとしてマルチバイト文字を渡さないでください。マルチバイト文字のサイズが事前にわからないからです。代わりに、常に文字または文字列へのポインタを渡します。
かつての(Windows NT 以前の)Windows オペレーティング システムでは、マルチバイト文字セット、特にダブルバイト文字セット(DBCS)がアジア言語に広く使用されていました。
ワイド文字 - Unicode
表意文字セットは Unicode でも表すことができます。Unicode は以下の 2 つの機能から成ります。
- UCS(Universal Character Set)は 100,000 個を上回る数の文字(コード ポイント)を提供します。
- UTF(Unicode Transformation Format)エンコード方式。UTF は、Unicode 用の可変長文字エンコードです。UTF では、すべての Unicode 文字をエンコードできます。Unicode はさまざまな文字エンコードで実装できます。最も一般的に使用されるエンコードは UTF-8 と UTF-16 です。
Windows NT 以降、すべての Windows は全面的に Unicode を使って構築されています。つまり、ウィンドウの作成、テキストの表示、文字列操作の実行などに使用するすべての Windows コア関数には Unicode 文字列が必要です。ANSI 文字列(1 バイト文字から成る文字列)を渡して Windows コア関数を呼び出すと、その関数はまずその文字列を Unicode に変換した後、その Unicode 文字列をオペレーティング システムに渡します。これらの変換はすべて、ユーザーにわからないように行われます。
Unicode 標準は、世界中のすべてのライティング システムで使用される文字の表現体系を記述したものです。Unicode の UCS(Universal Character Set: 国際文字集合)では、1,114,112 文字(すなわちコード ポイント)から成るコード空間を表すことができます。エンコードに応じて、Unicode 文字は 1 バイト、2 バイト、3 バイト、4 バイトのいずれかでエンコードできます。以下の UTF(Unicode Transformation Format)エンコード体系は文字の等価な表現であり、相互に容易に変換できます。
- UTF-8 ではコード ポイントごとに 1 バイトから 4 バイトを使用します (すべての ASCII 文字には 1 バイトを使用し、それ以外の文字には最大 4 バイトを使用します)。
- UTF-32 では各文字を 4 バイトで表します。
- UTF-16 では 2 バイトか 4 バイトのどちらかを使用します。現在世界中で使用されている文字の大半が含まれている基本多言語面(Basic Multilingual Plane: BMP)にある文字は、2 バイト(16 ビット)で表現できます。それ以外の面にある文字については、UTF-16 エンコードは 1 組の 16 ビット ワード(サロゲート ペアと呼ばれます)に帰着します。先頭の 256 個の Unicode 文字が ANSI 文字セットに対応します。
アプリケーションでは Unicode を使用することを強くお勧めします。
Windows オペレーティング システムでは、(各文字を一連の 16 ビット数値にマップする)UTF-16 をサポートしています。Delphi では、Unicode 文字の文字列は UnicodeString 型または WideString 型で表すことができます。
- WideString 型は 2 バイト文字要素から成る文字列を表します。このような 16 ビット文字はワイド文字と呼ばれます。WideChar は 2 バイト要素で、PWideChar は 2 バイト文字要素から成る NULL 終端文字列へのポインタです。WideString 文字型は基本的に Windows BSTR と同じであるため、COM アプリケーションでは WideString を使用しなければなりません。WideString には通常、UTF-16 エンコード文字が格納されます。コード ポイントは 2 バイトまたは 4 バイトで表される可能性があるので、WideString に含まれている 2 バイト要素の数は必ずしも文字列の文字数とは一致しません。
- UnicodeString 型は Unicode 文字の文字列を表現します。UnicodeString 型は参照カウントの対象になります。
WideString 型は COM アプリケーションで使用するのに適していますが、WideString は参照カウントの対象にはなりません。他の種類のアプリケーションでは、UnicodeString の方が柔軟性が高く効率的です。さらに、UnicodeString 型の処理には WideString 型の場合よりも多くの関数が使用可能であるため、UnicodeString が一般には推奨されます。
AnsiString 型はシングルバイト文字の文字列を表現するのに使用され、MBCS にも使用できるでしょう。AnsiString は Unicode には使用されません。MBCS という用語は、Unicode に言及する場合には使用されません。