mbrtoc32
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <uchar.h> で定義
|
||
size_t mbrtoc32( char32_t restrict * pc32, const char * restrict s, size_t n, mbstate_t * restrict ps ); |
(C11以上) | |
単一のコードポイントをナローマルチバイト文字表現から可変長32ビットワイド文字表現 (一般的には UTF-32) に変換します。
s がヌルポインタでなければ、次のマルチバイト文字 (あらゆるシフトシーケンスを含み、現在のマルチバイト変換状態 *ps を考慮に入れた) を完全にするために必要なバイト数を決定するために s の指すバイトから始まるマルチバイト文字列を最大 n バイト調べます。 s の次のマルチバイト文字が完全かつ有効であると決定できれば、それを対応する32ビットワイド文字に変換し、 (pc32 がヌルでなければ) それを *pc32 に格納します。
*s 内のマルチバイト文字が複数の char32_t のシーケンスに対応する場合 (UTF-32 では有り得ません)、この関数の最初の呼び出し後、次の mbrtoc32 の呼び出しが *s を見ることなく追加の char32_t を書き出すように、 *ps が更新されます。
s がヌルポインタの場合、 n および pc32 の値は無視され、その呼び出しは mbrtoc32(NULL, "", 1, ps) と同等になります。
生成されたワイド文字がヌル文字の場合、変換状態 *ps は初期シフト状態を表すようになります。
マクロ __STDC_UTF_32__ が定義されている場合、この関数が使用する32ビットエンコーディングは UTF-32 です。 そうでなければ、処理系定義です。 いずれの場合でも、この関数が使用するマルチバイト文字エンコーディングは、現在アクティブな C のロケールによって指定されます。
引数
| pc32 | - | 結果の32ビットワイド文字が書き込まれる位置を指すポインタ |
| s | - | 入力として使用されるマルチバイト文字列を指すポインタ |
| n | - | 調べる s 内の文字数の制限 |
| ps | - | マルチバイト文字列を解釈するときに使用される変換状態オブジェクトを指すポインタ |
戻り値
以下のうちいずれか最初に適用されるものを返します。
sから変換された (そしてヌルでなければ*pc32に格納された) 文字がヌル文字であった場合は0。sからの変換に成功したマルチバイト文字列のバイト数[1...n]。- 複数の
char32_t文字から次のchar32_tが*pc32に書き込まれた場合は(size_t)-3}。 この場合、入力から処理されるバイトはありません。 - 次の
nバイトがそこまでの部分は有効だけれども不完全なマルチバイト文字を構成する場合は(size_t)-2。*pc32には何も書き込まれません。 - エンコーディングエラーが発生した場合は
(size_t)-1。*pc32には何も書き込まれず、値 EILSEQ が errno に格納され、値*psは未規定になります。
例
Run this code
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <uchar.h>
#include <assert.h>
mbstate_t state;
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
size_t in_sz = sizeof in / sizeof *in;
printf("Processing %zu UTF-8 code units: [ ", in_sz);
for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned char)in[n]);
puts("]");
char32_t out[in_sz];
char *p_in = in, *end = in + in_sz;
char32_t *p_out = out;
size_t rc;
while((rc = mbrtoc32(p_out, p_in, end - p_in, &state)))
{
assert(rc != (size_t)-3); // no surrogate pairs in UTF-32
if(rc == (size_t)-1) break; // invalid input
if(rc == (size_t)-2) break; // truncated input
p_in += rc;
p_out += 1;
}
size_t out_sz = p_out - out + 1;
printf("into %zu UTF-32 code units: [ ", out_sz);
for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]);
puts("]");
}
出力:
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
into 5 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.28.1.3 The mbrtoc32 function (p: 400-401)
関連項目
(C11) |
32ビットワイド文字をマルチバイト文字列に変換します (関数) |
mbrtoc32 の C++リファレンス
| |