C

mbtowc

mbtowc

在头文件中定义
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不为null,则将其写入* pwc。

如果s是空指针,则重置全局转换状态并确定是否使用移位序列。

注意

每次调用mbtowc都会更新内部全局转换状态(类型为mbstate_t的静态对象,只有此函数已知)。 如果多字节编码使用移位状态,则必须小心避免回溯或多次扫描。 在任何情况下,多线程都不应该在没有同步的情况下调用mbtowc:可以使用mbrtowc。

参数

pwc-指向宽字符输出的指针
s-指向多字节字符的指针
n-限制可以检查的s中的字节数

返回值

如果s不是空指针,则返回多字节字符中包含的字节数,如果s指向的第一个字节没有形成有效的多字节字符,则返回-1;如果s指向空字符,则返回0'\ 0'。

如果s是空指针,则重置其内部转换状态以表示初始移位状态,如果当前多字节编码不是状态相关的(不使用移位序列),且如果当前多字节为非零值编码是依赖于状态的(使用移位序列),则返回0。

#include <stdio.h> #include <locale.h> #include <string.h> #include <stdlib.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, 0, 0 // reset the conversion state const char* end = ptr + strlen(ptr int ret; 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(u8"z\u00df\u6c34\U0001F34C" // or u8"zß水?" }

输出:

zß水?

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

mbrtowc(C95)将下一个多字节字符转换为宽字符,给定状态(函数)
mblen返回下一个多字节字符(函数)中的字节数

| mbtowc的C ++文档 |