mbrtoc32
在头文件<uchar.h>中定义 | | |
---|---|---|
size_t mbrtoc32(char32_t * pc32,const char * s,size_t n,mbstate_t * ps); | | (自C11以来) |
将单个代码点从其窄多字节字符表示转换为其可变长度32位宽字符表示形式(但通常为UTF-32)。
如果s不是空指针,则检查多字节字符串的至多n个字节,从s指向的字节开始,以确定完成下一个多字节字符(包括任何移位序列)所需的字节数。 如果函数确定s中的下一个多字节字符是完整且有效的,则将其转换为相应的32位宽字符并将其存储在* pc32中(如果pc32不为空)。
如果* s中的多字节字符对应于多char32_t序列(UTF-32不可能),那么在第一次调用此函数后,将更新* ps,以便下一次调用mbrtoc32将写出 额外的char32_t,不考虑* s。
如果s是一个空指针,n和pc32的值将被忽略,并且调用相当于mbrtoc32(NULL,“”,1,ps)。
如果生成的宽字符为空字符,则转换状态* ps表示初始转换状态。
如果__STDC_UTF_32__
定义了宏,则该函数使用的32位编码为UTF-32; 否则,它是实现定义的。在任何情况下,此函数使用的多字节字符编码均由当前活动的C语言环境指定。
参数
PC32 | - | 指向写入结果32位宽字符的位置的指针 |
---|---|---|
s | - | 指向用作输入的多字节字符串的指针 |
n | - | 限制可以检查的s中的字节数 |
ps | - | 指向解释多字节字符串时使用的转换状态对象的指针 |
返回值
以下第一项适用:
- 如果从s转换的字符(如果非空则存储在* pc32中)为空字符,则返回0
- 返回从s成功转换的多字节字符的字节数[1 ... n]
- 如果来自多char32_t字符的下一个char32_t现在已被写入* pc32。 在这种情况下,输入中没有处理字节。此时返回(size_t)-3
- 如果接下来的n个字节构成一个不完整的,但到目前为止有效的多字节字符。 没有任何信息写入* pc32。此时返回(size_t)-2
- 如果发生编码错误, 没有任何内容写入* pc32,值EILSEQ存储在errno中,并且如果* ps未指定,则返回(size_t)-1
例
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <uchar.h>
#include <assert.h>
mbstate_t state;
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
char in[] = u8"zß水?"; // or "z\u00df\u6c34\U0001F34C"
size_t in_sz = sizeof in / sizeof *in;
printf("Processing %zu UTF-8 code units: [ ", in_sz);
for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned char)in[n]);
puts("]");
char32_t out[in_sz];
char *p_in = in, *end = in + in_sz;
char32_t *p_out = out;
int rc;
while((rc = mbrtoc32(p_out, p_in, end - p_in, &state)))
{
assert(rc != -3); // no surrogate pairs in UTF-32
if(rc < 0) break;
p_in += rc;
p_out += 1;
}
size_t out_sz = p_out - out + 1;
printf("into %zu UTF-32 code units: [ ", out_sz);
for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]);
puts("]");
}
输出:
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
into 5 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]
参考
- C11标准(ISO / IEC 9899:2011):
- 7.28.1.3 mbrtoc32函数(p:400-401)
扩展内容
c32rtomb(C11) | 将32位宽字符转换为窄多字节字符串(函数) |
---|
| mbrtoc32的C ++文档 |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com