名前空間
変種
操作

c32rtomb

From cppreference.com
< c‎ | string‎ | multibyte
ヘッダー <uchar.h> で定義
size_t c32rtomb( char* restrict s, char32_t c32, mbstate_t* restrict ps );
(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です。それ以外の場合は、実装定義です。 このマクロは常に定義され、エンコーディングは常にUTF-32です。(since C23) いずれの場合も、この関数が使用するマルチバイト文字エンコーディングは、現在アクティブなCロケールによって指定されます。

目次

[編集] パラメータ

s - マルチバイト文字が格納される狭い文字配列へのポインタ
c32 - 変換する32ビットワイド文字
ps - マルチバイト文字列を解釈する際に使用される変換状態オブジェクトへのポインタ

[編集] 戻り値

成功した場合、 s が指す文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返します。この値は 0 になることがあります。例えば、マルチ char32_t ユニットシーケンスの先頭の char32_t ユニットを処理する場合(UTF-32では発生しません)。

失敗した場合( c32 が有効な32ビットワイド文字でない場合)、 -1 を返し、 *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 The c32rtomb function (p: 411)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.28.1.4 The c32rtomb function (p: 401)

[編集] 関連項目

ナローマルチバイト文字をUTF-32エンコーディングに変換する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)