c32rtomb
來自 cppreference.com
在標頭檔案 <uchar.h> 中定義 |
||
(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)
[編輯] 參閱
(C11) |
將窄多位元組字元轉換為 UTF-32 編碼 (函式) |
C++ 文件中關於 c32rtomb
|