命名空间
变体
操作

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。转换受当前区域设置的 LC_CTYPE 类别影响。
如果 wc 是空字符,则空字节将写入 s,前面是恢复初始移位状态所需的任何移位序列。
如果 s 是空指针,则此函数将重置全局转换状态,并确定是否使用移位序列。
2)(1) 相同,只是结果将返回到输出参数 status 中,并且以下错误将在运行时检测到并调用当前安装的 约束处理程序 函数
  • ssz 小于将写入的字节数(除非 s 为空)
  • ssz 大于 RSIZE_MAX(除非 s 为空)
  • s 是空指针,但 ssz 不为零
与所有边界检查函数一样,wctomb_s 只有在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <stdlib.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。

内容

[编辑] 备注

每次调用 wctomb 都会更新内部全局转换状态(一个类型为 mbstate_t 的静态对象,仅此函数知道)。如果多字节编码使用移位状态,则此函数不是可重入的。在任何情况下,多个线程不应在不进行同步的情况下调用 wctomb:可以改用 wcrtombwctomb_s

与大多数边界检查函数不同,wctomb_s 不会在其输出中添加空字符,因为它的设计是为了用于逐字符处理字符串的循环中。

[编辑] 参数

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