名稱空間
變體
操作

c32rtomb

來自 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 是空指標,則呼叫等價於 c32rtomb(buf, U'\0', ps),其中 buf 是某個內部緩衝區。

如果 c32 是空寬字元 U'\0',則儲存一個空位元組,前面是恢復初始移位狀態所需的任何移位序列,並且轉換狀態引數 *ps 更新為表示初始移位狀態。

如果定義了宏 __STDC_UTF_32__,則此函式使用的 32 位編碼是 UTF-32;否則,它是實現定義的。該宏始終定義,編碼始終是 UTF-32。(C23 起)在任何情況下,此函式使用的多位元組字元編碼由當前活動的 C 語言環境指定。

目錄

[編輯] 引數

s - 指向窄字元陣列的指標,多位元組字元將儲存在此處
c32 - 要轉換的 32 位寬字元
ps - 指向轉換狀態物件的指標,用於解釋多位元組字串

[編輯] 返回值

成功時,返回寫入到其第一個元素由 s 指向的字元陣列的位元組數(包括任何移位序列)。該值可能為 0,例如在處理多 char32_t 單元序列中的前導 char32_t 單元時(在 UTF-32 中不會發生)。

失敗時(如果 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)

[編輯] 參閱

將窄多位元組字元轉換為 UTF-32 編碼
(函式) [編輯]
C++ 文件中關於 c32rtomb