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

mbrtoc16

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

size_t mbrtoc16(char16_t * pc16,const char * s,size_t n,mbstate_t * ps);

(自C11以来)

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

如果s不是空指针,则检查多字节字符串的至多n个字节,从s指向的字节开始,以确定完成下一个多字节字符(包括任何移位序列)所需的字节数。 如果函数确定s中的下一个多字节字符是完整且有效的,则将其转换为相应的16位宽字符并将其存储在* pc16中(如果pc16不为null)。

如果* s中的多字节字符对应于多char16_t序列(例如UTF-16中的代理对),那么在第一次调用此函数后,将更新* ps,以便下次调用mbrtoc16时将写入 额外的char16_t,而不考虑* s。

如果s是一个空指针,n和pc16的值将被忽略,并且调用相当于mbrtoc16(NULL,“”,1,ps)。

如果生成的宽字符为空字符,则转换状态* ps表示初始转换状态。

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

参数

PC16

-

指向结果16位宽字符将被写入的位置的指针

s

-

指向用作输入的多字节字符串的指针

n

-

限制可以检查的s中的字节数

ps

-

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

返回值

以下第一项适用:

  • 如果从s转换的字符(并且存储在* pc16中,如果非null)是空字符,则返回0
  • 返回从s成功转换的多字节字符的字节数[1 ... n]
  • 如果来自多char16_t字符(例如代理对)的下一个char16_t现在已被写入* pc16,则返回(size_t)-3。在这种情况下,输入中没有处理字节。
  • 如果接下来的n个字节构成一个不完整的,但到目前为止有效的多字节字符, 没有任何信息写入* pc16。则返回(size_t)-2
  • 如果发生编码错误。 没有任何内容写入* pc16,值EILSEQ存储在errno中,并且如果* ps未指定,则返回(size_t)-1

代码语言:javascript
复制
#include <stdio.h>
#include <locale.h>
#include <uchar.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("]");
 
    char16_t out[in_sz];
    char *p_in = in, *end = in + in_sz;
    char16_t *p_out = out;
    int rc;
    while((rc = mbrtoc16(p_out, p_in, end - p_in, &state)))
    {
        if(rc == -3) // surrogate pairs in UTF-16
            p_out += 1;
        else if(rc > 0) {
            p_in += rc;
            p_out += 1;
        } else break;
    }
 
    size_t out_sz = p_out - out + 1;
    printf("into %zu UTF-16 code units: [ ", out_sz);
    for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]);
    puts("]");
}

输出:

代码语言:javascript
复制
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
into 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ]

参考

  • C11标准(ISO / IEC 9899:2011):
    • 7.28.1.1 mbrtoc16函数(p:398-399)

扩展内容

c16rtomb(C11)

将16位宽字符转换为窄多字节字符串(函数)

| mbrtoc16的C ++文档 |

扫码关注腾讯云开发者

领取腾讯云代金券