mbrtowc
來自 cppreference.com
在標頭檔案 <wchar.h> 中定義 |
||
(自 C95 起) | ||
(C99 起) | ||
將窄多位元組字元轉換為其寬字元表示形式。
如果 `s` 不是空指標,則最多檢查 `n` 個多位元組字元字串的位元組,從 `s` 指向的位元組開始,以確定完成下一個多位元組字元所需的位元組數(包括任何移位序列,並考慮當前多位元組轉換狀態 *ps)。如果函式確定 `s` 中的下一個多位元組字元是完整且有效的,則將其轉換為相應的寬字元並存儲在 *pwc 中(如果 `pwc` 不為空)。
如果 `s` 是空指標,則 `n` 和 `pwc` 的值被忽略,並且呼叫等效於 mbrtowc(NULL, "", 1, ps)。
如果生成的寬字元是空字元,則儲存在 *ps 中的轉換狀態是初始移位狀態。
如果定義了環境宏 __STDC_ISO_10646__,則 wchar_t 型別的值與 Unicode 必需字元集中的字元的短識別符號相同(通常為 UTF-32 編碼);否則,它是實現定義的。在任何情況下,此函式使用的多位元組字元編碼由當前活動的 C 語言環境指定。
目錄 |
[編輯] 引數
pwc | - | 指向將寫入結果寬字元的位置的指標 |
s | - | 指向用作輸入的多位元組字元字串的指標 |
n | - | s 中可檢查的位元組數的限制 |
ps | - | 指向解釋多位元組字元字串時使用的轉換狀態的指標 |
[編輯] 返回值
以下適用情況中的第一個
- 0 如果從 `s` 轉換的字元(如果非空則儲存在 pwc 中)是空字元
- 從 `s` 成功轉換的多位元組字元的位元組數 [1...n]
- (size_t)-2 如果接下來的 `n` 個位元組構成一個不完整但目前有效的多位元組字元。不向 *pwc 寫入任何內容。
- (size_t)-1 如果發生編碼錯誤。不向 `*pwc` 寫入任何內容,值 EILSEQ 儲存在 errno 中,並且 *ps 的值未指定。
[編輯] 示例
執行此程式碼
#include <stdio.h> #include <locale.h> #include <string.h> #include <wchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); mbstate_t state; memset(&state, 0, sizeof state); char in[] = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌" 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("]"); wchar_t out[in_sz]; char *p_in = in, *end = in + in_sz; wchar_t *p_out = out; int rc; while((rc = mbrtowc(p_out, p_in, end - p_in, &state)) > 0) { p_in += rc; p_out += 1; } size_t out_sz = p_out - out + 1; printf("into %zu wchar_t 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 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]