ユニバーサル文字名とは
ユニバーサル文字名(Universal Character Names、UCN)は、C++の標準で定義されている機能で、ソースコード中で任意のUnicode文字を表現するための方法です。ユニバーサル文字名は、\u
または \U
の後にUnicodeのコードポイントを16進数で記述することで表現します。
例えば、ユニバーサル文字名を使用して、次のように記述することができます:
char32_t ch = U'\U0001F600'; // U+1F600は絵文字の"grinning face"を表します。
この機能は、特に非ASCII文字を含む文字列リテラルや識別子を扱う際に有用です。しかし、ユニバーサル文字名の形式が正しくない場合、コンパイラはエラーを出力します。これについては、次のセクションで詳しく説明します。
C++でのユニバーサル文字名の使用
C++では、ユニバーサル文字名を使用して、ソースコード中で任意のUnicode文字を表現することができます。これは、特に非ASCII文字を含む文字列リテラルや識別子を扱う際に有用です。
ユニバーサル文字名は、\u
または \U
の後にUnicodeのコードポイントを16進数で記述することで表現します。\u
は16ビットのコードポイントを、\U
は32ビットのコードポイントを表現します。
例えば、次のように記述することができます:
std::string s = "\u0068\u0065\u006C\u006C\u006F"; // "hello"を表します。
std::u32string t = U"\U0001F600\U0001F603\U0001F604"; // 絵文字の"grinning face"、"grinning face with big eyes"、"grinning face with smiling eyes"を表します。
また、識別子にもユニバーサル文字名を使用することができます:
int \u006D\u0061\u0069\u006E() { // "main"を表します。
return 0;
}
ただし、ユニバーサル文字名の形式が正しくない場合、コンパイラはエラーを出力します。これについては、次のセクションで詳しく説明します。
ユニバーサル文字名の形式エラー
C++のユニバーサル文字名は、\u
または \U
の後にUnicodeのコードポイントを16進数で記述する形式を取ります。しかし、この形式が正しくない場合、コンパイラはエラーを出力します。
例えば、次のようなエラーが発生することがあります:
char32_t ch = U'\U001F600'; // エラー:ユニバーサル文字名の形式が正しくありません
このコードでは、ユニバーサル文字名の形式が正しくありません。なぜなら、\U
の後には8桁の16進数が必要であるにもかかわらず、ここでは7桁しか提供されていないからです。正しい形式は次のようになります:
char32_t ch = U'\U0001F600'; // 正しい:U+1F600は絵文字の"grinning face"を表します。
このように、ユニバーサル文字名の形式が正しくないと、コンパイラはエラーを出力します。このエラーを回避するためには、ユニバーサル文字名の形式を正しく記述することが重要です。これについては、次のセクションで詳しく説明します。
エラーの回避方法
ユニバーサル文字名の形式エラーを回避するためには、以下の点に注意することが重要です:
- 形式の正確さ:ユニバーサル文字名は、
\u
または\U
の後にUnicodeのコードポイントを16進数で記述する形式を取ります。\u
の後には4桁、\U
の後には8桁の16進数が必要です。
char32_t ch1 = U'\u263A'; // 正しい:U+263Aは"smiling face"を表します。
char32_t ch2 = U'\U0001F600'; // 正しい:U+1F600は絵文字の"grinning face"を表します。
-
範囲の確認:ユニバーサル文字名で表現できるUnicodeのコードポイントは、0x0から0x10FFFFの範囲に制限されています。この範囲外の値を使用すると、エラーが発生します。
-
識別子の制限:識別子にユニバーサル文字名を使用する場合、最初の文字はアルファベットまたはアンダースコアでなければなりません。また、C++の予約語を識別子として使用することはできません。
これらの点に注意することで、ユニバーサル文字名の形式エラーを回避することができます。これにより、C++のソースコード中で任意のUnicode文字を安全に使用することが可能になります。