名稱空間
變體
操作

wctomb, wctomb_s

來自 cppreference.com
< c‎ | string‎ | multibyte
在標頭檔案 <stdlib.h> 中定義
int wctomb( char *s, wchar_t wc );
(1)
errno_t wctomb_s( int *restrict status, char *restrict s, rsize_t ssz, wchar_t wc );
(2) (C11 起)
1) 將寬字元 wc 轉換為多位元組編碼並將其(包括任何移位序列)儲存在 s 所指向的字元陣列的第一個元素中。儲存的字元不超過 MB_CUR_MAX 個。轉換受當前 locale 的 LC_CTYPE 類別影響。
如果 wc 是空字元,則將空位元組寫入 s,前面是恢復初始移位狀態所需的任何移位序列。
如果 s 是空指標,此函式將重置全域性轉換狀態並確定是否使用移位序列。
2)(1) 相同,除了結果在輸出引數 status 中返回,並且在執行時檢測到以下錯誤並呼叫當前安裝的 約束處理程式 函式:
  • ssz 小於將寫入的位元組數(除非 s 為空)
  • ssz 大於 RSIZE_MAX(除非 s 為空)
  • s 是空指標但 ssz 不為零
與所有邊界檢查函式一樣,只有當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <stdlib.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證 wctomb_s 可用。

目錄

[編輯] 注意

每次呼叫 wctomb 都會更新內部全域性轉換狀態(一個型別為 mbstate_t 的靜態物件,僅此函式可知)。如果多位元組編碼使用移位狀態,則此函式不可重入。在任何情況下,多個執行緒在沒有同步的情況下不應呼叫 wctomb:可以使用 wcrtombwctomb_s 代替。

與大多數邊界檢查函式不同,wctomb_s 不會以 null 終止其輸出,因為它設計用於逐字元處理字串的迴圈中。

[編輯] 引數

s - 指向輸出字元陣列的指標
wc - 要轉換的寬字元
ssz - 寫入 s 的最大位元組數(陣列 s 的大小)
status - 指向輸出引數的指標,結果(多位元組序列的長度或移位序列狀態)將儲存在此處

[編輯] 返回值

1) 如果 s 不是空指標,則返回 wc 的多位元組表示中包含的位元組數,如果 wc 不是有效字元,則返回 -1
如果 s 是空指標,則將其內部轉換狀態重置為表示初始移位狀態,如果當前多位元組編碼不依賴於狀態(不使用移位序列),則返回 0,如果當前多位元組編碼依賴於狀態(使用移位序列),則返回非零值。
2) 成功時返回零,在這種情況下,wc 的多位元組表示儲存在 s 中,其長度儲存在 *status 中,或者,如果 s 為空,則移位序列狀態儲存在 status 中)。編碼錯誤或執行時約束衝突時返回非零值,在這種情況下,(size_t)-1 儲存在 *status 中。*status 中儲存的值永遠不超過 MB_CUR_MAX

[編輯] 示例

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
void demo(wchar_t wc)
{
    const char* dep = wctomb(NULL, wc) ? "Yes" : "No";
    printf("State-dependent encoding? %s.\n", dep);
 
    char mb[MB_CUR_MAX];
    int len = wctomb(mb, wc);
    printf("wide char '%lc' -> multibyte char [", wc);
    for (int idx = 0; idx < len; ++idx)
        printf("%s%#2x", idx ? " " : "", (unsigned char)mb[idx]);
    printf("]\n");
}
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    printf("MB_CUR_MAX = %zu\n", MB_CUR_MAX);
    demo(L'A');
    demo(L'\u00df');
    demo(L'\U0001d10b');
}

可能的輸出

MB_CUR_MAX = 6
State-dependent encoding? No.
wide char 'A' -> multibyte char [0x41]
State-dependent encoding? No.
wide char 'ß' -> multibyte char [0xc3 0x9f]
State-dependent encoding? No.
wide char '𝄋' -> multibyte char [0xf0 0x9d 0x84 0x8b]

[編輯] 參考

  • C17 標準 (ISO/IEC 9899:2018)
  • 7.22.7.3 wctomb 函式 (p: 261)
  • K.3.6.4.1 wctomb_s 函式 (p: 443)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.22.7.3 wctomb 函式 (p: 358-359)
  • K.3.6.4.1 wctomb_s 函式 (p: 610-611)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.20.7.3 wctomb 函式 (p: 322-323)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.10.7.3 wctomb 函式

[編輯] 另請參閱

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