std::mbrtoc32
来自cppreference.com
在标头 <cuchar> 定义 | ||
std::size_t mbrtoc32(char32_t* pc32, constchar* s, | (C++11 起) | |
将窄多字节字符转换为其 UTF-32 字符表示。
若 s 非空,则检查 s 指向字节开始的至多 n 字节多字节字符串,以判断补完下个多字节字符所需的字节数(含任意迁移序列)。若函数判定 s
中下个多字节字符完整有效,则将它转换成对应 32 位宽字符存储于 *pc32(若 pc32 非空)。
若 *s 中多字节字符对应一个多 char32_t
序列(对 UTF-32 而言不可能),则在首次调用此函数后更新 *ps 使得下次调用 mbrtoc32
时不必考虑 *s 也能写入附加的 char32_t。
若 s 是空指针,则忽略 n 与 pc32 的值,该调用等价于 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,存储 EILSEQ 于 errno 且 *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 文档 |