mbtowc
来自 cppreference.com
在头文件 <stdlib.h> 中定义 |
||
int mbtowc( wchar_t* pwc, const char* s, size_t n ) |
(直到 C99) | |
int mbtowc( wchar_t* restrict pwc, const char* restrict s, size_t n ) |
(自 C99 以来) | |
将第一个字节由 s 指向的多字节字符转换为宽字符,如果 pwc 不是空指针,则写入 *pwc。
如果 s 是空指针,则重置全局转换状态,并确定是否使用移位序列。
内容 |
[编辑] 注意
每次调用 mbtowc
都会更新内部全局转换状态(一个类型为 mbstate_t 的静态对象,仅此函数知道)。如果多字节编码使用移位状态,则必须注意避免回溯或多次扫描。在任何情况下,多个线程不应在没有同步的情况下调用 mbtowc
:可以使用 mbrtowc 代替。
[编辑] 参数
pwc | - | 指向输出宽字符的指针 |
s | - | 指向多字节字符的指针 |
n | - | 可检查 s 中字节数量的限制 |
[编辑] 返回值
如果 s 不是空指针,则返回多字节字符中包含的字节数,或如果 s 指向的第一个字节不构成有效的多字节字符,则返回 -1,或如果 0 是 s 指向空字符 '\0'。
如果 s 是空指针,则将其内部转换状态重置为表示初始移位状态,如果当前多字节编码不是状态相关的(不使用移位序列),则返回 0,或者如果当前多字节编码是状态相关的(使用移位序列),则返回非零值。
[编辑] 示例
运行此代码
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <wchar.h> // print multibyte string to wide-oriented stdout // equivalent to wprintf(L"%s\n", ptr); void print_mb(const char* ptr) { mbtowc(NULL, NULL, 0); // reset the conversion state const char* end = ptr + strlen(ptr); int ret = 0; for (wchar_t wc; (ret = mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret) wprintf(L"%lc", wc); wprintf(L"\n"); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding print_mb("z\u00df\u6c34\U0001F34C"); // or "zß水🍌" }
输出
zß水🍌
[编辑] 参考资料
- C23 标准 (ISO/IEC 9899:2024)
- 7.24.7.2 mbtowc 函数 (p: TBD)
- C17 标准 (ISO/IEC 9899:2018)
- 7.22.7.2 mbtowc 函数 (p: 260)
- C11 标准 (ISO/IEC 9899:2011)
- 7.22.7.2 mbtowc 函数 (p: 358)
- C99 标准 (ISO/IEC 9899:1999)
- 7.20.7.2 mbtowc 函数 (p: 322)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.10.7.2 mbtowc 函数
[编辑] 参见
(C95) |
将下一个多字节字符转换为宽字符,给定状态 (函数) |
返回下一个多字节字符中的字节数 (函数) | |
C++ 文档 用于 mbtowc
|