mbtowc
来自 cppreference.cn
定义于头文件 <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;如果 s 指向空字符 '\0',则返回 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 函数 (页码:待定)
- C17 标准 (ISO/IEC 9899:2018)
- 7.22.7.2 mbtowc 函数 (页码:260)
- C11 标准 (ISO/IEC 9899:2011)
- 7.22.7.2 mbtowc 函数 (页码:358)
- C99 标准 (ISO/IEC 9899:1999)
- 7.20.7.2 mbtowc 函数 (页码:322)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.10.7.2 mbtowc 函数
[编辑] 参见
(C95) |
在给定状态下,将下一个多字节字符转换为宽字符 (函数) |
返回下一个多字节字符中的字节数 (函数) | |