概要
マルチバイト文字を、UTF-16文字 (char16_t) に変換する。
sが指す位置から最大nバイトを読み込んで1文字分のマルチバイト文字を解析し、対応するUTF-16のコード単位をpc16が指す位置へ格納する。変換状態はpsが指すオブジェクトに保持されるため、複数のスレッドから安全に使用できる。
1つのマルチバイト文字が2つのchar16_t(サロゲートペア)に対応する場合、最初の呼び出しで上位サロゲートが格納され、続けて同じ変換状態で呼び出すと、入力を消費せずに下位サロゲートが格納される。このとき戻り値は(size_t)-3となる。
sがヌルポインタの場合、mbrtoc16(nullptr, "", 1, ps)の呼び出しと等価であり、変換状態を初期状態に戻す動作となる。
戻り値
| 戻り値 | 意味 |
|---|---|
0 |
ヌル文字へ変換された |
正の値(n以下) |
変換に使用したバイト数 |
(size_t)-1 |
不正なバイト列である。errnoにEILSEQが設定され、変換状態は未規定となる |
(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[] = "あ";
char16_t c = 0;
std::mbstate_t state{};
// UTF-8の3バイトを消費して1文字へ変換される
std::size_t n = std::mbrtoc16(&c, src, sizeof(src), &state);
std::printf("%zu %04X\n", n, (unsigned)c);
}
出力例
3 3042
サロゲートペアになる文字を変換する
#include <cuchar>
#include <clocale>
#include <cstdio>
int main()
{
std::setlocale(LC_ALL, "C.UTF-8");
const char src[] = "\U0001F600"; // 😀 (U+1F600)
std::mbstate_t state{};
char16_t high = 0;
char16_t low = 0;
// 1回目の呼び出しで4バイトを消費し、上位サロゲートを格納する
std::size_t n1 = std::mbrtoc16(&high, src, sizeof(src), &state);
// 2回目の呼び出しは入力を消費せず、下位サロゲートを格納して(size_t)-3を返す
std::size_t n2 = std::mbrtoc16(&low, src + n1, sizeof(src) - n1, &state);
std::printf("%zu %04X\n", n1, (unsigned)high);
std::printf("%zd %04X\n", (long)n2, (unsigned)low);
}
出力例
4 D83D
-3 DE00
バージョン
言語
- C++11
関連項目
c16rtomb: 逆方向の変換mbrtoc32mbrtoc8: UTF-8文字への変換std::mbrtowc(): ワイド文字への変換