Skip to content

Latest commit

 

History

History
79 lines (57 loc) · 4.52 KB

utf8_string_literals.md

File metadata and controls

79 lines (57 loc) · 4.52 KB

UTF-8文字列リテラル

  • 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プレフィックスは使用できない。

参照するUCSの規格

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

関連項目

参照