c32rtomb
ヘッダ <uchar.h> で定義
|
||
(C11以上) | ||
単一のコードポイントを可変長32ビットワイド文字表現 (一般的には UTF-32) からナローマルチバイト文字表現に変換します。
s
がヌルポインタでなければ、 c32
のマルチバイト文字表現 (あらゆるシフトシーケンスを含み、現在のマルチバイト変換状態 *ps を考慮に入れた) を格納するために必要なバイト数を決定し、 s
によって最初の要素が指されている文字配列にそのマルチバイト表現を格納し、必要に応じて *ps を更新します。 最大 MB_CUR_MAX バイトが書き込まれます。
s
がヌルポインタであれば、その呼び出しは何らかの内部バッファ buf
に対する c32rtomb(buf, U'\0', ps) と同等です。
c32
がヌルワイド文字 U'\0' であれば、初期シフト状態を復元するために必要なあらゆるシフトシーケンスの後にヌルのバイトが格納され、 *ps が初期シフト状態を表すように更新されます。
マクロ __STDC_UTF_32__ が定義されている場合、この関数が使用する32ビットエンコーディングは UTF-32 です。 そうでなければ、処理系定義です。 いずれの場合でも、この関数が使用するマルチバイト文字エンコーディングは、現在アクティブな C のロケールによって指定されます。
目次 |
[編集] 引数
s | - | マルチバイト文字が格納されるナロー文字配列を指すポインタ |
c32 | - | 変換する32ビットワイド文字 |
ps | - | マルチバイト文字列を解釈するときに使用される変換状態オブジェクトを指すポインタ |
[編集] 戻り値
成功した場合は、 s
によって最初の要素が指されている文字配列に書き込まれた (あらゆるシフトシーケンスを含む) バイト数を返します。 この値は、例えば複数の char32_t の単位のシーケンスの先行する char32_t の単位を処理するとき (UTF-32 では発生しません) など、 0 になる場合があります。
失敗した場合 (c32 が有効な32ビット文字でない場合) は、 -1 を返し、 EILSEQ を errno に格納し、 *ps を未規定な状態に置きます。
[編集] 例
#include <stdio.h> #include <locale.h> #include <uchar.h> #include <stdlib.h> mbstate_t state; int main(void) { setlocale(LC_ALL, "en_US.utf8"); char32_t in[] = U"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-32 code units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", in[n]); puts("]"); char out[MB_CUR_MAX * in_sz]; char *p = out; for(size_t n = 0; n < in_sz; ++n) { size_t rc = c32rtomb(p, in[n], &state); if(rc == (size_t)-1) break; p += rc; } size_t out_sz = p - out; printf("into %zu UTF-8 code units: [ ", out_sz); for(size_t x = 0; x < out_sz; ++x) printf("%#x ", +(unsigned char)out[x]); puts("]"); }
出力:
Processing 5 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ] into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
[編集] 参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.28.1.4 The c32rtomb function (p: 401)
[編集] 関連項目
(C11) |
マルチバイト文字列から次の32ビットワイド文字を生成します (関数) |
c32rtomb の C++リファレンス
|