std::mbrtoc32
来自cppreference.com
<tbody>
</tbody>
| 在标头 <cuchar> 定义
|
||
std::size_t mbrtoc32( char32_t* pc32, const char* 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 是空指针,则忽略 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 (unsigned char c : str)
std::cout << std::hex << +c << ' ';
std::cout << "]\n";
std::mbstate_t state{}; // 零初始化为初始状态
char32_t c32;
const char* 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<unsigned char>(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 文档
| |