首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

wctomb_s

在头文件<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

示例

代码语言:javascript
复制
#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');
}

可能的输出:

代码语言:javascript
复制
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 ++文档

扫码关注腾讯云开发者

领取腾讯云代金券