ワイド文字
ワイド文字(ワイドもじ)とは、主にC言語およびC++における文法要素で、1文字あたりのバイト数を通常より多くしたデータ型である。
概要
C言語やC++の基本実行文字集合は通常、ASCIIのサブセットの文字種からなる(ただし実際の文字コードが何であるかは異なりうる)。
漢字のような拡張実行文字集合は、通常マルチバイト文字として扱われるが、1文字を構成するバイト数が可変長であり、本来1つの文字でありながら複数の文字の組(あるいは文字列)として扱わなければならないなどの不便がある。そうした問題を解消するために、1文字を1つの整数値で扱えるようにすることを目指したのがワイド文字である。
wchar_t型
C言語 では1995年の ISO/IEC 9899/AMD1:1995 より、wchar_t
型や wchar.h、wctype.h などのヘッダーファイルが追加になった。ワイド文字は wchar_t
というデータ型で表現する。char型を用いた文字・文字列に対応するように、ワイド文字定数は「L'c'
」として表記する(通常の文字定数は「'c'
」)。同様に、ワイド文字から構成される文字列をワイド文字列と呼び、そのリテラルは「L"str"
」と表記する。
C言語での wchar_t
は単なる typedef
名(他の型の別名として定義されている)であるが、C++においては予約語である。コンパイラによっては、「wchar_t
」を予約語とみなすか否かコンパイラの設定で切り替えられるものもある。
C99 や C++98 の場合、ワイド文字定数・文字列リテラルには ISO 10646 文字集合の数値で表現するユニバーサル文字名を使用することもできる。
char16_t, char32_t 型
2011年に改正された C/C++ の標準規格、C11 と C++11 では、新たに2つの文字型が導入された。char16_t と char32_t であり、それぞれ UTF-16 と UTF-32 を内部表現とする。u'c' や U'c' あるいは u"str" や U"str" のように小文字の u と大文字の U を前置することで、それぞれ char16_t と char32_t の文字定数・文字列リテラルを表現する。また、u8 を前置することで UTF-8 を表現する。
wchar_t 型は環境により16ビットだったり、32ビットだったりするが、char16_t は必ず16ビットであり、char32_t は必ず32ビットである。
内部表現
wchar_t 型は C および C++ の双方の標準規格において、少なくとも-127から+127までまたは0から255までの範囲を表現できる数値型、ということのみ定められている(少なくともchar型と同じ大きさが必要)。charがASCIIであるとは限らなかったり、floatやdoubleがIEEE 754の単精度・倍精度であるとは限らなかったりすることと同様に、wchar_tの内部表現もUnicodeである必要はない。本来はCode Set Independent(符号化集合に独立)なのである。
しかし、Windowsでは16ビット (UTF-16)、LinuxやMac OS Xでは32ビット (UTF-32) であるため、その他の環境でもUnicodeを用いた符号化形式であると誤解されて、あるいは仮定してプログラムが作られることがある。そのようなプログラムは、Unicodeを用いた符号化形式とは限らない一般のUnixなどへの移植の際に問題が表面化する。なお、C99より、wchar_tがUnicodeと互換性のある場合、__STDC_ISO_10646__が事前定義されると定められている。
D言語
D言語では、charと別に、次の2つの文字型が用意されている。
- wchar
- UTF-16を格納する16ビットの文字型
- dchar
- UTF-32を格納する32ビットの文字型