名稱空間
變體
操作

wcrtomb, wcrtomb_s

來自 cppreference.com
< c‎ | string‎ | multibyte
在標頭檔案 <wchar.h> 中定義
(1)
size_t wcrtomb( char *s, wchar_t wc, mbstate_t *ps);
(自 C95 起)
size_t wcrtomb( char *restrict s, wchar_t wc, mbstate_t *restrict ps);
(C99 起)
errno_t wcrtomb_s(size_t *restrict retval, char *restrict s, rsize_t ssz,
                  wchar_t wc, mbstate_t *restrict ps);
(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),其中 retvalbuf 是內部變數(其大小大於 MB_CUR_MAX
結果在輸出引數 retval 中返回
以下錯誤在執行時被檢測到並呼叫當前安裝的約束處理程式函式
  • retvalps 是空指標。
  • 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 指向的字元陣列的位元組數(包括任何移位序列)。
失敗時(如果 wc 不是有效的寬字元),返回 (size_t)-1,將 EILSEQ 儲存在 errno 中,並使 *ps 處於未指定狀態。
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 ]

[edit] 參考文獻

  • C11 標準 (ISO/IEC 9899:2011)
  • 7.29.6.3.3 wcrtomb 函式 (p: 444)
  • K.3.9.3.1.1 wcrtomb_s 函式 (p: 647-648)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.24.6.3.3 wcrtomb 函式 (p: 390)

[edit] 參閱

將寬字元轉換為其多位元組表示
(function) [edit]
將下一個多位元組字元轉換為寬字元,給定狀態
(function) [edit]
C++ 文件 關於 wcrtomb