名稱空間
變體
操作

mbrtowc

來自 cppreference.com
< c‎ | string‎ | multibyte
在標頭檔案 <wchar.h> 中定義
size_t mbrtowc( wchar_t* pwc, const char* s, size_t n, mbstate_t* ps );
(自 C95 起)
size_t mbrtowc( wchar_t *restrict pwc, const char *restrict s, size_t n,
                mbstate_t *restrict ps );
(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 ]

[編輯] 參考

  • C11 標準 (ISO/IEC 9899:2011)
  • 7.29.6.3.2 mbrtowc 函式 (p: 443)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.24.6.3.2 mbrtowc 函式 (p: 389)

[編輯] 另請參見

將下一個多位元組字元轉換為寬字元
(函式) [編輯]
將寬字元轉換為其多位元組表示,給定狀態
(函式) [編輯]
C++ 文件 關於 mbrtowc