std::mbrtoc32

来自cppreference.com
< cpp‎ | string‎ | multibyte
在标头 <cuchar> 定义
std::size_t mbrtoc32(char32_t* pc32,

                      constchar* s,
                      std::size_t n,

                      std::mbstate_t* ps );
(C++11 起)

将窄多字节字符转换为其 UTF-32 字符表示。

s 非空,则检查 s 指向字节开始的至多 n 字节多字节字符串,以判断补完下个多字节字符所需的字节数(含任意迁移序列)。若函数判定 s 中下个多字节字符完整有效,则将它转换成对应 32 位宽字符存储于 *pc32(若 pc32 非空)。

*s 中多字节字符对应一个多 char32_t 序列(对 UTF-32 而言不可能),则在首次调用此函数后更新 *ps 使得下次调用 mbrtoc32 时不必考虑 *s 也能写入附加的 char32_t

s 是空指针,则忽略 npc32 的值,该调用等价于 std::mbrtoc32(NULL, "", 1, ps)

若产生的宽字符是空字符,则转换状态 *ps 表示初始迁移状态。

此函数使用的多字节编码由当前活跃的 C 本地环境指定。

目录

[编辑]参数

pc32 - 指向将写入产生的 32 位宽字符的位置的指针
s - 指向用作输入的多字节字符串的指针
n - s 中能检验的字节数上的限制
ps - 指向转译多字节字符串时所用的转换状态对象的指针

[编辑]返回值

下列首个适用者:

  • 若从 s 转换的字符为空字符(并存储于 *pc32 中,若它非空)则为 0
  • 成功从 s 转换的多字节字符的字节数 [1...n]
  • 若现已将来自多 char32_t 字符的下个 char32_t 写入 *pc32,则为 -3。此情况下不从输入处理字节。
  • 若接下来 n 个字节组成不完整,但到此仍合法的多字节字符则为 -2。不写入内容到 *pc32
  • 若出现编码错误则为 -1。不写入内容到 *pc32,存储 EILSEQerrno*ps 的值未指定。

[编辑]示例

#include <cassert>#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::showbase;for(unsignedchar c : str)std::cout<<std::hex<<+c <<' ';std::cout<<"]\n";   std::mbstate_t state{};// 零初始化为初始状态char32_t c32;constchar* ptr = str.c_str(), *end = str.c_str()+ str.size()+1;   while(std::size_t rc = std::mbrtoc32(&c32, ptr, end - ptr, &state)){std::cout<<"下一个 UTF-32 字符: "<<std::hex<<static_cast<int>(c32)<<" 来自 ";assert(rc !=(std::size_t)-3);// UTF-32 中没有代理对if(rc ==(std::size_t)-1)break;if(rc ==(std::size_t)-2)break;std::cout<<std::dec<< rc <<" 个字符 [ ";for(std::size_t n =0; n < rc;++n)std::cout<<std::hex<<+static_cast<unsignedchar>(ptr[n])<<' ';std::cout<<"]\n"; ptr += rc;}}

输出:

处理 10 个字节: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c ] 下一个 UTF-32 字符: 0x7a 来自 1 个字符 [ 0x7a ] 下一个 UTF-32 字符: 0xdf 来自 2 个字符 [ 0xc3 0x9f ] 下一个 UTF-32 字符: 0x6c34 来自3 个字符 [ 0xe6 0xb0 0xb4 ] 下一个 UTF-32 字符: 0x1f34c 来自 4 个字符 [ 0xf0 0x9f 0x8d 0x8c ]

[编辑]参阅

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