c32rtomb
|
ヘッダーで定義
<uchar.h>
|
||
| (C11以降) | ||
可変長32ビットワイド文字表現(ただし通常はUTF-32)から、単一のコードポイントをそのナローマルチバイト文字表現に変換します。
s が null ポインタでない場合、この関数は c32 のマルチバイト文字表現を格納するために必要なバイト数(シフトシーケンスを含み、現在のマルチバイト変換状態 * ps を考慮して)を決定し、マルチバイト文字表現を s が指す先頭要素の文字配列に格納し、必要に応じて * ps を更新する。この関数によって書き込まれるバイト数は最大で MB_CUR_MAX である。
s がヌルポインタの場合、この呼び出しは内部バッファ buf に対する c32rtomb ( buf, U ' \0 ' , ps ) と等価です。
c32 がナルワイド文字 U ' \0 ' である場合、初期シフト状態を復元するために必要なシフトシーケンスに続けてナルバイトが格納され、変換状態パラメータ * ps は初期シフト状態を表すように更新されます。
マクロ __STDC_UTF_32__ が定義されている場合、この関数で使用される32ビットエンコーディングはUTF-32である。そうでない場合、そのエンコーディングは実装定義である。 このマクロは常に定義されており、エンコーディングは常にUTF-32である。 (C23以降) いずれの場合でも、この関数で使用されるマルチバイト文字エンコーディングは、現在有効なCロケールによって指定される。
目次 |
パラメータ
| s | - | マルチバイト文字が格納されるナロウ文字配列へのポインタ |
| c32 | - | 変換対象の32ビットワイド文字 |
| ps | - | マルチバイト文字列の解釈時に使用される変換状態オブジェクトへのポインタ |
戻り値
成功時は、 s が指す先頭要素を持つ文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返します。この値は 0 の場合があります。例えば、マルチ char32_t 単位シーケンス(UTF-32では発生しません)における先頭の char32_t 単位を処理する場合などです。
失敗時( c32 が有効な32ビットワイド文字でない場合)、 - 1 を返し、 EILSEQ を errno に格納し、 * ps を未規定の状態のままにする。
例
MSVCではUTF_8が正しく動作するために
/utf-8
コンパイラフラグが必要です。
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <uchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); const 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("%s%08X", n ? " " : "", in[n]); puts("]"); char* out = malloc(MB_CUR_MAX * in_sz); char* p = out; mbstate_t state = {0}; 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("%s%02X", x ? " " : "", +(unsigned char)out[x]); puts("]"); free(out); }
出力:
Processing 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000] into 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 7.30.1.6 c32rtomb関数 (p: 411)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.28.1.4 c32rtomb関数 (p: 401)
関連項目
|
(C11)
|
ナローマルチバイト文字をUTF-32エンコーディングに変換する
(関数) |
|
C++ documentation
for
c32rtomb
|
|