std:: mbrtowc
|
定义于头文件
<cwchar>
|
||
|
std::
size_t
mbrtowc
(
wchar_t
*
pwc,
const
char
*
s,
|
||
将窄多字节字符转换为宽字符。
如果 s 不是空指针,则检查多字节字符串中最多 n 个字节(从 s 指向的字节开始),以确定完成下一个多字节字符(包括任何移位序列)所需的字节数。如果该函数确定 s 中的下一个多字节字符完整且有效,则将其转换为对应的宽字符并存储到 * pwc 中(如果 pwc 非空)。
如果 s 是空指针,则忽略 n 和 pwc 的值,此时调用等价于 std :: mbrtowc ( nullptr, "" , 1 , ps ) 。
如果生成的宽字符是空字符,则存储在 * ps 中的转换状态为初始移位状态。
目录 |
参数
| pwc | - | 指向结果宽字符写入位置的指针 |
| s | - | 用作输入的多字节字符串指针 |
| n | - | s 中可检查字节数的上限 |
| ps | - | 解释多字节字符串时使用的转换状态指针 |
返回值
以下情况中首先适用的条件:
- 0 如果从 s 转换的字符(若 pwc 非空则存储其中)是空字符。
- 成功从 s 转换的多字节字符的字节数 [ 1 ... n ] 。
- static_cast < std:: size_t > ( - 2 ) 如果接下来的 n 字节构成不完整但当前有效的多字节字符。不会向 * pwc 写入任何内容。
- static_cast < std:: size_t > ( - 1 ) 如果发生编码错误。不会向 * pwc 写入任何内容,值 EILSEQ 将存入 errno ,且 * ps 的值保持未指定状态。
示例
#include <clocale> #include <cstring> #include <cwchar> #include <iostream> void print_mb(const char* ptr) { std::mbstate_t state = std::mbstate_t(); // 初始状态 const char* end = ptr + std::strlen(ptr); int len; wchar_t wc; while ((len = std::mbrtowc(&wc, ptr, end-ptr, &state)) > 0) { std::wcout << "Next " << len << " bytes are the character " << wc << '\n'; ptr += len; } } int main() { std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 窄多字节编码 const char* str = "z\u00df\u6c34\U0001d10b"; // 或 u8"zß水𝄋" // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; print_mb(str); }
输出:
Next 1 bytes are the character z Next 2 bytes are the character ß Next 3 bytes are the character 水 Next 4 bytes are the character 𝄋
参见
|
将下一个多字节字符转换为宽字符
(函数) |
|
|
在给定状态下将宽字符转换为其多字节表示形式
(函数) |
|
|
[virtual]
|
将字符串从
ExternT
转换为
InternT
,例如从文件读取时
(
std::codecvt<InternT,ExternT,StateT>
的虚受保护成员函数)
|
|
C 文档
for
mbrtowc
|
|