非常教程

C参考手册

字符串 | Strings

wctomb

在头文件<stdlib.h>中定义

int wctomb(char * s,wchar_t wc);

(1)

errno_t wctomb_s(int *限制状态,char *限制s,rsize_t ssz,wchar_t wc);

(2)

(自C11以来)

1)将宽字符转换wc为多字节编码并将其存储在第一个元素指向的char数组中(包括任何移位序列)s。不超过MB_CUR_MAX字符存储。

如果wc是空字符,则写入空字节s,之前是恢复初始移位状态所需的任何移位序列。

如果s是空指针,则此函数会重置全局转换状态并确定是否使用移位序列。

2)与(1)相同,除了在out参数中返回结果status并在运行时检测到以下错误并调用当前安装的约束处理函数:

  • ssz小于将被写入的字节数(除非s为空)
  • ssz大于RSIZE_MAX(除非s为空)
  • s是一个空指针,但ssz不是零

作为所有边界检查函数,wctomb_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含之前用户定义为整数常量时才能保证可用stdlib.h

注意

每次调用都会wctomb更新内部全局转换状态(类型的静态对象mbstate_t,只有该函数已知)。如果多字节编码使用移位状态,则此功能不可重入。在任何情况下,多个线程都不应该在wctomb没有同步的情况下调用:wcrtomb或者wctomb_s可以用来代替。

与大多数边界检查函数不同,wctomb_s它不会空结束它的输出,因为它被设计用于逐字符处理字符串的循环中。

参数

s

-

指向字符数组的输出指针

wc

-

宽字符转换

ssz

-

写入s的最大字节数(数组的大小)

status

-

指向将存储结果(多字节序列长度或移位序列状态)的out参数的指针

返回值

1)如果s不是空指针,则返回多字节表示中包含的字节数,wc或者-1如果wc不是有效字符。

如果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)
{
    printf("State-dependent encoding?   %d\n", wctomb(NULL, wc));
 
    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("%#2x ", (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?   0
wide char 'A' -> multibyte char '0x41 '
State-dependent encoding?   0
wide char 'ß' -> multibyte char '0xc3 0x9f '
State-dependent encoding?   0
wide char '?' -> multibyte char '0xf0 0x9d 0x84 0x8b '

参考

  • 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函数

另请参阅

mbtowc

将下一个多字节字符转换为宽字符(函数)

wcrtombwcrtomb_s(C95)(C11)

将宽字符转换为其多字节表示,给定状态(函数)

| 用于wctomb |的C ++文档

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。