Namespaces
Variants

std:: mbrtoc16

From cppreference.net
定义于头文件 <cuchar>
std:: size_t mbrtoc16 ( char16_t * pc16, const char * s,
std:: size_t n, std:: mbstate_t * ps ) ;
(C++11 起)

将窄多字节字符转换为UTF-16字符表示形式。

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

如果 * s 中的多字节字符对应一个多 char16_t 序列(例如 UTF-16 中的代理对),则在首次调用此函数后, * ps 会被更新,使得下一次调用 mbrtoc16 时将写出附加的 char16_t ,而无需考虑 * s

如果 s 是空指针,则忽略 n pc16 的值,该调用等价于 std :: mbrtoc16 ( nullptr, "" , 1 , ps )

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

该函数使用的多字节编码由当前生效的 C 语言区域设置指定。

目录

参数

pc16 - 指向将写入结果16位字符的位置的指针
s - 用作输入的多字节字符串的指针
n - 在s中可检查的字节数的限制
ps - 解释多字节字符串时使用的转换状态对象的指针

返回值

以下情况中首先适用的条件:

  • 0 如果从 s 转换的字符(若 * pc16 非空则存储其中)是空字符。
  • 成功从 s 转换的多字节字符所占的字节数 [ 1 , n ]
  • - 3 如果来自多 char16_t 字符(例如代理对)的下一个 char16_t 已被写入 * pc16 。此情况下不会处理输入中的任何字节。
  • - 2 如果接下来的 n 字节构成不完整但截至目前有效的多字节字符。不会向 * pc16 写入任何内容。
  • - 1 如果发生编码错误。不会向 * pc16 写入任何内容,值 EILSEQ 将存储于 errno ,且 * ps 的值未指定。

示例

#include <clocale>
#include <cstring>
#include <cuchar>
#include <cwchar>
#include <iomanip>
#include <iostream>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::string str{"z\u00df\u6c34\U0001F34C"}; // 或 u8"zß水🍌"
    std::cout << "处理 " << str.size() << " 字节: [" << std::uppercase
              << std::setfill('0') << std::hex;
    for (int n{}; unsigned char c : str)
        std::cout << (n++ ? " " : "") << +c;
    std::cout << "]\n";
    std::mbstate_t state{}; // 零初始化为初始状态
    char16_t c16{};
    const char* ptr{&str[0]}, *end{&str[0] + str.size()};
    while (std::size_t rc{std::mbrtoc16(&c16, ptr, end - ptr + 1, &state)})
    {
        std::cout << "下一个 UTF-16 字符: " << std::setw(4)
                  << static_cast<unsigned short>(c16) << " 从 ";
        if (rc == std::size_t(-3))
            std::cout << "之前的代理对获得\n";
        else if (rc == std::size_t(-2))
            continue;
        else if (rc == std::size_t(-1))
            break;
        else
        {
            std::cout << std::dec << rc << " 字节 [";
            for (std::size_t n{}; n != rc; ++n)
                std::cout << (n ? " " : "") << std::hex
                          << +static_cast<unsigned char>(ptr[n]);
            std::cout << "]\n";
            ptr += rc;
        }
    }
}

输出:

处理 10 字节: [7A C3 9F E6 B0 B4 F0 9F 8D 8C]
下一个 UTF-16 字符: 007A 从 1 字节 [7A]
下一个 UTF-16 字符: 00DF 从 2 字节 [C3 9F]
下一个 UTF-16 字符: 6C34 从 3 字节 [E6 B0 B4]
下一个 UTF-16 字符: D83C 从 4 字节 [F0 9F 8D 8C]
下一个 UTF-16 字符: DF4C 从之前的代理对获得

参阅

(C++11)
将 UTF-16 字符转换为窄多字节编码
(函数)
(C++20)
将窄多字节字符转换为 UTF-8 编码
(函数)
[virtual]
将字符串从 ExternT 转换为 InternT ,例如从文件读取时
(std::codecvt<InternT,ExternT,StateT> 的虚受保护成员函数)
C 文档 for mbrtoc16