最終更新日時:
が更新

履歴 編集

function
<cuchar>

std::mbrtoc32(C++11)

namespace std {
  size_t mbrtoc32(char32_t* pc32, const char* s, size_t n, mbstate_t* ps);
}

概要

マルチバイト文字を、UTF-32文字 (char32_t) に変換する。

sが指す位置から最大nバイトを読み込んで1文字分のマルチバイト文字を解析し、対応するUTF-32のコード単位をpc32が指す位置へ格納する。変換状態はpsが指すオブジェクトに保持されるため、複数のスレッドから安全に使用できる。

char32_tはすべてのUnicodeコードポイントを1つの値で表現できるため、mbrtoc16()と違ってサロゲートペアを扱う必要はない。

sがヌルポインタの場合、mbrtoc32(nullptr, "", 1, ps)の呼び出しと等価であり、変換状態を初期状態に戻す動作となる。

戻り値

戻り値 意味
0 ヌル文字へ変換された
正の値(n以下) 変換に使用したバイト数
(size_t)-1 不正なバイト列である。errnoEILSEQが設定され、変換状態は未規定となる
(size_t)-2 次のnバイトは不完全だが、不正ではない文字の一部である
(size_t)-3 入力を消費せず、前回の呼び出しで解析した文字の続きのコード単位が格納された

備考

  • psがヌルポインタの場合、処理系が用意した内部のオブジェクトが変換状態として使用される
  • マルチバイト文字の解釈は、現在のロケールカテゴリLC_CTYPEに依存する

#include <cuchar>
#include <clocale>
#include <cstdio>

int main()
{
  std::setlocale(LC_ALL, "C.UTF-8");

  const char src[] = "あ";
  char32_t c = 0;
  std::mbstate_t state{};

  // UTF-8の3バイトを消費して1文字へ変換される
  std::size_t n = std::mbrtoc32(&c, src, sizeof(src), &state);
  std::printf("%zu %04X\n", n, (unsigned)c);
}

出力例

3 3042

バージョン

言語

  • C++11

関連項目

参照