概要
これまで、Unicodeのユニバーサルキャラクタ名を指定するためには、u8"\u0100"
のように\u
または\U
に続いてコードポイントを記述していた。
しかしこれではコード上でなんの文字を表しているのかわかりにくいため、文字の名前を指定できるようにする。
構文としてはu8"\N{LATIN CAPITAL LETTER A WITH MACRON}"
のように、\N{…}
の波カッコで囲まれた中に、ユニバーサルキャラクタ名を入力する。
使用可能な文字はUnicode規格ISO/IEC 10646で定義される。
名前のマッチングはUAX44-LM2を参照しており、これによって
- 大文字・小文字を区別しない
- ハイフンの省略
- アンダースコアをハイフンに置換
するなど、柔軟な指定ができるようになっている。例として、以下の名前はすべてU+200B
(ZERO WIDTH SPACE、ゼロ幅スペース) を表すものとして使用できる:
ZERO WIDTH SPACE
ZERO-WIDTH SPACE
zero-width space
ZERO width S P_A_C E
例
#include <iostream>
int main()
{
// ユニバーサルキャラクタ名をコードポイントで指定
const char8_t* str1 = u8"\u0100\u0300";
std::cout << reinterpret_cast<const char*>(str1) << std::endl;
// ユニバーサルキャラクタ名を名前で指定
// 上記のコードポイント指定と等価
const char8_t* str2 = u8"\N{LATIN CAPITAL LETTER A WITH MACRON}\N{COMBINING GRAVE ACCENT}";
std::cout << reinterpret_cast<const char*>(str2) << std::endl;
}
出力
Ā̀
Ā̀