ワイド文字とは
ワイド文字とは、主に
C言語および
C++で使用される
データ型で、1文字を表現するのに通常よりも多くのバイト数を使用します。これは、
ASCII文字だけでは表現できない、
漢字などの多言語文字を扱うために導入されました。
概要
C言語や
C++の基本的な
文字コードは通常
ASCIIのサブセットですが、実際の
文字コードは規定されていません。
漢字などの拡張文字は、
マルチバイト文字として扱われることが一般的です。しかし、
マルチバイト文字は1文字を構成するバイト数が可変長であり、複数の文字として扱わなければならないなどの不便さがあります。
そこで、1文字を1つの整数値で扱えるようにするために、ワイド文字が導入されました。これにより、プログラミングがより容易になり、多言語対応が促進されました。
wchar_t型
C言語では、
1995年の規格改定で`wchar_t`型が導入されました。`wchar_t`はワイド文字を表現するための
データ型で、`
`や``などのヘッダーファイルで使用されます。
従来の`char`型を用いた文字定数や文字列リテラルは、それぞれ`'c'`や`"str"`のように表記されますが、ワイド文字定数やワイド文字列リテラルは、大文字の`L`をプレフィックスとして付加し、それぞれ`L'c'`や`L"str"`と表記します。
`wchar_t`型はC言語ではtypedefによるエイリアスですが、C++ではキーワードとして定義されています。コンパイラによっては、組み込み型として扱うかどうかを設定できる場合があります。
C++では文字定数を文字リテラル、文字列リテラルと呼び、それぞれ`char`型、`const char[]`型を持つ一方、ワイド文字リテラルは`wchar_t`型、`const wchar_t[]`型を持ちます。
C99およびC++98の規格では、ワイド文字定数や文字列リテラルに、ISO 10646文字集合の数値で表現するユニバーサル文字名を使用することも可能です。
内部表現
`char`型のサイズは常に1バイトであることが規格で保証されています。一方、`wchar_t`型は、符号付きの場合、少なくとも-127から+127まで、符号なしの場合、少なくとも0から255までの範囲を表現できる数値型であると定義されているだけで、サイズや内部表現はプラットフォームに依存します。`wchar_t`の内部表現はUnicodeである必要はなく、本来はCode Set Independentです。
例えば、Windowsでは2バイトのUTF-16、LinuxやmacOSでは4バイトのUTF-32が用いられることが多いですが、他の環境では異なる符号化形式が使用されている場合もあります。そのため、Unicodeを前提としたプログラムは移植時に問題が発生する可能性があります。
ただし、C99以降の規格では、`wchar_t`がUnicodeと互換性がある場合、`__STDC_ISO_10646__`が事前定義されると定められています。
char16_t, char32_t型
`wchar_t`型のサイズや符号化形式がプラットフォームに依存することが問題視され、Unicodeの普及に伴い、移植性の問題が表面化してきました。
C11およびC++11では、新たに`char16_t`と`char32_t`の2つの文字型が導入されました。これらはそれぞれUTF-16とUTF-32を内部表現として持ちます。
`u'c'`や`U'c'`、`u"str"`や`U"str"`のように小文字の`u`や大文字の`U`をプレフィックスとして付けることで、`char16_t`や`char32_t`の文字定数や文字列リテラルを表現できます。また、`u8`を前置することでUTF-8の文字列リテラルを表現できます。
C++20では`char8_t`型が導入され、UTF-8文字リテラルの型が`char8_t`に、UTF-8文字列リテラルの型が`const char8_t[]`に変更されました。
C言語では、`char16_t`および`char32_t`はそれぞれ`uint_least16_t`と`uint_least32_t`のtypedefエイリアスですが、C++ではキーワードとして定義され、それぞれ`std::uint_least16_t`および`std::uint_least32_t`と同サイズで、別の型として扱われます。
`char16_t`と`char32_t`のサイズはそれぞれ16ビット、32ビットよりも大きい可能性がありますが、格納される値はそれぞれ16ビット、32ビット幅です。
D言語では、`char`型の他に、次の2つの文字型が用意されています。
- - `wchar`: UTF-16を格納する16ビットの文字型
- - `dchar`: UTF-32を格納する32ビットの文字型
まとめ
ワイド文字は、多言語対応を行う上で重要な概念です。`wchar_t`型はプラットフォーム依存性が高いため、移植性を考慮する場合には、`char16_t`や`char32_t`を使用することが推奨されます。各文字型の特性を理解し、適切なデータ型を選択することが重要です。