最終更新日時:
が更新

履歴 編集

function
<cuchar>

std::c32rtomb(C++11)

namespace std {
  size_t c32rtomb(char* s, char32_t c32, mbstate_t* ps);
}

概要

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

c32をマルチバイト文字へ変換し、sが指す配列へ書き込む。書き込まれるバイト数は最大でMB_CUR_MAXである。変換状態はpsが指すオブジェクトに保持されるため、複数のスレッドから安全に使用できる。

sがヌルポインタの場合、c32rtomb(buf, uU'\0', ps)の呼び出しと等価であり(bufは内部のバッファ)、変換状態を初期状態に戻す動作となる。

戻り値

  • 書き込んだバイト数を返す
  • 上位サロゲートのみを渡すなど、文字が確定しない場合は0を返す
  • c32が有効な文字ではない場合、(size_t)-1を返し、errnoEILSEQを設定する

備考

  • psがヌルポインタの場合、処理系が用意した内部のオブジェクトが変換状態として使用される
  • 書き込み先の配列は、MB_CUR_MAXバイト以上の大きさをもたなければならない
  • マルチバイト文字への変換は、現在のロケールカテゴリLC_CTYPEに依存する

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

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

  char buffer[MB_CUR_MAX];
  std::mbstate_t state{};

  // 'あ' はUTF-8では3バイトへ変換される
  std::size_t n = std::c32rtomb(buffer, U'あ', &state);

  std::printf("%zu\n", n);
}

出力例

3

バージョン

言語

  • C++11

関連項目

参照