mbrtowc
来自cppreference.com
在标头 <wchar.h> 定义
|
||
(C95 起) (C99 前) |
||
(C99 起) | ||
转换窄多字节字符为宽字符。
若 s
不是空指针,则从 s
所指向的字节起,审查多字节字符串的至多 n
个字节,以确定完成下个多字节字符(包含任何迁移序列)的字节数。若该函数确定 s
的下个多字节字符完整且合法,则将它转换为对应的宽字符,并存储之于 *pwc (若 pwc
非空)。
若 s
是空指针,则忽略 n
和 pwc
的值,调用等价于 mbrtowc(NULL, "", 1, ps) 。
若产生的宽字符是空字符,则存储于 *ps 的转换状态为初始迁移状态。
参数
pwc | - | 指向要写入结果宽字符位置的指针 |
s | - | 指向用作输入的多字节字符串的指针 |
n | - | s 中能被检验的字节数限制
|
ps | - | 指向转译多字节字符串时的转换状态的指针 |
返回值
应用下列最前者:
- 若自
s
转换的字符为空字符,则为 0 (且存储于pwc若它非空) - 成功
s
从转换的多字节字符 [1...n] 的字节数 - 若接下来的
n
字节组成不完整,但该部分合法的宽字符,则为 (size_t)-2 。不写入 *pwc 。 - 若出现编码错误则为 (size_t)-1 。不写入
*pwc
,存储值 EILSEQ 于 errno ,并且置 *ps 的值为未指定。
示例
运行此代码
#include <stdio.h> #include <locale.h> #include <string.h> #include <wchar.h> // 打印多字节字符串到宽面向的 stdout // 等价于 wprintf(L"%s\n", ptr); void print_mb(const char* ptr) { mbstate_t state; memset(&state, 0, sizeof state); const char* end = ptr + strlen(ptr); int len; wchar_t wc; while((len = mbrtowc(&wc, ptr, end-ptr, &state)) > 0) { wprintf(L"Next %d bytes are the character %lc \n", len, wc); ptr += len; } } int main(void) { setlocale(LC_ALL, "en_US.utf8"); // UTF-8 窄多字符编码 print_mb(u8"z\u00df\u6c34\U0001F34C"); // 或 u8"zß水🍌" }
输出:
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 🍌
引用
- C11 标准(ISO/IEC 9899:2011):
- 7.29.6.3.2 The mbrtowc function (第 443 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.24.6.3.2 The mbrtowc function (第 389 页)
参阅
将下一个多字节字符转换成宽字符 (函数) | |
(C95)(C11) |
给定状态,将宽字符转换成其多字节表示 (函数) |