php实现C32,c32rtomb - [ C语言中文开发手册 ] - 在线原生手册 - php中文网

在头文件中定义size_t c32rtomb(char * s,char32_t c32,mbstate_t * ps);(自C11以来)

将单个代码点从其可变长度的32位宽字符表示(通常为UTF-32)转换为其窄多字节字符表示形式。

如果s不是空指针,则函数确定存储c32的多字节字符表示(包括任何移位序列)所需的字节数,并将多字节字符表示存储在第一个元素由s指向的字符数组中。 该函数最多可以写入MB_CUR_MAX个字节。

如果s是空指针,那么对于某些内部缓冲区buf,调用等价于c32rtomb(buf,U'\ 0',ps)。

如果c32是空宽字符U'\ 0',则存储空字节,之前是恢复初始移位状态所必需的任何移位序列,并且更新转换状态参数* ps以表示初始移位状态。

如果定义了宏__STDC_UTF_32__,则该函数使用的32位编码为UTF-32; 否则,它是实现定义的。 在任何情况下,此函数使用的多字节字符编码均由当前活动的C语言环境指定。

参数

s-指向多字节字符将被存储在其中的窄字符数组的指针C32-要转换的32位宽字符

PS-指向解释多字节字符串时使用的转换状态对象的指针

返回值

成功时,返回写入字符数组的第一个元素由s指向的字节数(包括任何移位序列)。 该值可以是0,例如:处理多char32_t单元序列中的前导char32_t单元时(不发生在UTF-32中)。

失败时(如果c32不是有效的32位宽字符)则返回-1,将EILSEQ存储在errno中,并使* ps处于未指定状态。

#include #include #include #include 

mbstate_t state;int main(void){    setlocale(LC_ALL, "en_US.utf8");

char32_t in[] = U"zß水?"; // or "z\u00df\u6c34\U0001F34C"

size_t in_sz = sizeof in / sizeof *in;

printf("Processing %zu UTF-32 code units: [ ", in_sz);    for(size_t n = 0; n 

char out[MB_CUR_MAX * in_sz];

char *p = out;    for(size_t n = 0; n 

int rc = c32rtomb(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 

输出:

Processing 5 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]

参考

C11标准(ISO / IEC 9899:2011):7.28.1.4 c32rtomb函数(p:401)

扩展内容

mbrtoc32(C11)从一个窄多字节字符串(函数)生成下一个32位宽字符

| c32rtomb的C ++文档 |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值