char
C言語の最初のキャラクタータイプ。1バイト。ASCIIやISO-8859に使う。UTF8やShiftJISなどでも使う。Windowsの場合は通常マルチバイト文字と呼ばれるシステムの言語設定を反映した各国で異なる文字列になる。日本語のWindowsではShiftJISが入る。しかし今ではWindowsでは通常wchar_tを使いcharは使わない。Linuxでは通常UTF8を使うのでcharにはUTF8が入る。
wchar_t
次にできたキャラクタータイプ。サイズは実装依存。Windowsでは2バイト、Linuxでは4バイトになるので注意。何が入っているかも実装依存。WindowsではUTF16-LE。Linuxでは通常使用しないが、多分UTF32-LEが入っている。エンディアンはCPU依存と思われる。
char16_t, char32_t
2バイトと4バイトのキャラクタータイプ。何が入るかは実装依存。
リテラル
リテラルを表すには文字列の前に1~2文字の記号をつける。
1 2 3 4 5 |
// https://docs.microsoft.com/en-us/cpp/cpp/char-wchar-t-char16-t-char32-t?view=vs-2017 char ch1{ 'a' }; // or { u8'a' } wchar_t ch2{ L'a' }; char16_t ch3{ u'a' }; char32_t ch4{ U'a' }; |
標準ライブラリの文字列型
基本的にはbasic_stringなので、これに文字型を渡して
typedefしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> using namespace std; int main() { string cs = "aaa"; string u8s = u8"aaa"; wstring ws = L"aaa"; u16string u16s = u"aaa"; u32string u32s = U"aaa"; cout << cs << endl; cout << u8s << endl; wcout << ws << endl; return 0; } |
標準入出力
string用のcoutとwstring用のwcout以外は定義されていないようだ。
Windowsのchar16_t
Windowsではwchar_tとchar16_tはともに2バイトなのでキャストできるのだろう。
参考:実装ごとのサイズ
wchar_tのサイズがWindowsとLinuxで違う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
Linux 64bit GCC: sizeof(char) == 1 sizeof(wchar_t) == 4 sizeof(char16_t) == 2 sizeof(char32_t) == 4 sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 8 sizeof(long long) == 8 sizeof(float) == 4 sizeof(double) == 8 sizeof(void*) == 8 Linux 32bit GCC: izeof(char) == 1 sizeof(wchar_t) == 4 sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 4 sizeof(long long) == 8 sizeof(float) == 4 sizeof(double) == 8 sizeof(void*) == 4 Windows vc2015/vc2017 32bit cl: sizeof(char) == 1 sizeof(wchar_t) == 2 sizeof(char16_t) == 2 sizeof(char32_t) == 4 sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 4 sizeof(long long) == 8 sizeof(float) == 4 sizeof(double) == 8 sizeof(void*) == 4 Windows vc2017 64bit cl: sizeof(char) == 1 sizeof(wchar_t) == 2 sizeof(char16_t) == 2 sizeof(char32_t) == 4 sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 4 sizeof(long long) == 8 sizeof(float) == 4 sizeof(double) == 8 sizeof(void*) == 8 Windows 32bit mingw + g++: sizeof(char) == 1 sizeof(wchar_t) == 2 sizeof(char16_t) == 2 sizeof(char32_t) == 4 sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 4 sizeof(long long) == 8 sizeof(float) == 4 sizeof(double) == 8 sizeof(void*) == 4 |