- cpp11[meta cpp]
char
の文字列リテラルにu8
プレフィックスを付けることで、その文字列リテラルはUCS/Unicode文字コードのUTF-8符号化形式にエンコードされる。
// 変数sには、UTF-8エンコーディングされた「あいうえお」という文字列が代入される
char s[] = u8"あいうえお";
// 文字列中にユニバーサルキャラクタ名を直接入力できる。
// \uからはじめて4桁、もしくは\Uからはじめて8桁がユニバーサルキャラクタ名として扱われる。
char t[] = u8"\U00020BB7野家"; // 𠮷野家
u8
プレフィックスを指定しない場合は、実装定義のマルチバイト文字コードにエンコードされる。その実装定義の文字コードは、ASCII文字コードと互換があることは保証されない。そのため、UTF-8のASCII互換部分が、実装定義の文字コードと互換があることも、保証されない。
C++20ではUTF-8文字リテラルの型がconst char[N]
ではなくconst char8_t[N]
になる
-
文字列リテラルに
u8
プレフィックスを付けることで、UTF-8にエンコードされたchar
型の配列に初期化される。 -
UTF-8の文字列リテラルとワイド文字列リテラルが隣接していた場合、文字列は連結されずに、プログラムは不適格となる。
wchar_t ws[] = "hello" L" world"; // OK : L"hello world" //wchar_t ws[] = u8"hello" L" world"; // コンパイルエラー!
-
文字列リテラルのなかには、UCS/Unicodeのユニバーサルキャラクタ名を直接記述できる。たとえば、UTF-8文字列リテラル
u8"\u215A"
はU+215Aコードポイントを含む文字列である"⅚"
(VULGAR FRACTION FIVE SIXTHS) を表す。\u
の場合は16進数で4桁固定のユニバーサルキャラクタ名を、\U
の場合は16進数で8桁固定のユニバーサルキャラクタ名を記述する。 -
文字リテラルに
u8
プレフィックスは使用できない。
C++11時点の規格では、UCS (Universal Coded Character Set) の規格としてISO/IEC 10646-1:1993を参照する。
C++11時点での標準ライブラリでは、文字列と整数の変換を行う関数、および入出力の機能は、UTF-8に対応していない。そのため、システムのマルチバイト文字コードに変換する必要がある。たとえば、コンソール、ターミナル、コマンドプロンプトといった標準出力の出力先にUTF-8で直接出力できない場合には、出力可能な文字コードに変換する必要がある。そのシステムのマルチバイト文字コードがUTF-8であれば、変換の必要はない。
#include <iostream>
#include <string>
int main()
{
std::string s = u8"あいうえお";
// バイト数を取得
// UTF-8のため、ひとつのコードポイント(≒文字)のバイト数は固定ではない
std::size_t byte_size = s.size();
std::cout << byte_size << std::endl;
}
- s.size()[link /reference/string/basic_string/size.md]
15