wcrtomb, wcrtomb_s
來自 cppreference.com
在標頭檔案 <wchar.h> 中定義 |
||
(1) | ||
(自 C95 起) | ||
(C99 起) | ||
(2) | (C11 起) | |
將寬字元轉換為其窄多位元組表示。
1) 如果
s
不是空指標,該函式確定儲存 wc
的多位元組字元表示所需的位元組數(包括任何移位序列,並考慮當前的多位元組轉換狀態 *ps),並將多位元組字元表示儲存在第一個元素由 s
指向的字元陣列中,必要時更新 *ps。此函式最多可寫入 MB_CUR_MAX 位元組。 如果
s
是空指標,則此呼叫等效於 wcrtomb(buf, L'\0', ps),其中 buf
是某個內部緩衝區。 如果 wc 是空寬字元 L'\0',則儲存一個空位元組,前面是恢復初始移位狀態所需的任何移位序列,並且轉換狀態引數 *ps 被更新以表示初始移位狀態。
如果定義了環境宏 __STDC_ISO_10646__,則型別 wchar_t 的值與 Unicode 必需集中字元的短識別符號相同(通常是 UTF-32 編碼);否則,它是實現定義的。在任何情況下,此函式使用的多位元組字元編碼由當前活動的 C 語言環境指定。
2) 與(1)相同,但:
如果
s
是空指標,則此呼叫等效於 wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps),其中 retval
和 buf
是內部變數(其大小大於 MB_CUR_MAX) 結果在輸出引數
retval
中返回 以下錯誤在執行時被檢測到並呼叫當前安裝的約束處理程式函式
-
retval
或ps
是空指標。 -
ssz
為零或大於 RSIZE_MAX(除非s
為空) -
ssz
小於將要寫入的位元組數(除非s
為空) -
s
是空指標但ssz
不為零
-
- 與所有邊界檢查函式一樣,
wcrtomb_s
僅在實現定義了 __STDC_LIB_EXT1__ 且使用者在包含 <wchar.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時才保證可用。
目錄 |
[edit] 引數
s | - | 指向窄字元陣列的指標,多位元組字元將儲存在此處 |
wc | - | 要轉換的寬字元 |
ps | - | 指向轉換狀態物件的指標,用於解釋多位元組字串 |
ssz | - | 要寫入的最大位元組數(緩衝區 s 的大小) |
retval | - | 指向輸出引數的指標,結果(多位元組字串中的位元組數,包括任何移位序列)將儲存在此處 |
[edit] 返回值
1) 成功時,返回寫入到第一個元素由
s
指向的字元陣列的位元組數(包括任何移位序列)。2) 成功時返回零,失敗時返回非零,在此情況下,s[0] 被設定為 '\0'(除非
s
為空或 ssz
為零或大於 RSIZE_MAX)並且 *retval 被設定為 (size_t)-1(除非 retval
為空)[edit] 示例
執行此程式碼
#include <stdio.h> #include <locale.h> #include <string.h> #include <wchar.h> #include <stdlib.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); mbstate_t state; memset(&state, 0, sizeof state); wchar_t in[] = L"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu wchar_t units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned int)in[n]); puts("]"); char out[MB_CUR_MAX * in_sz]; char *p = out; for(size_t n = 0; n < in_sz; ++n) { int rc = wcrtomb(p, in[n], &state); if(rc == -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("%#x ", +(unsigned char)out[x]); puts("]"); }
輸出
Processing 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ] into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]