函数
<cwchar>

mbrtowc

size_t mbrtowc (wchar_t* pwc, const char* pmb, size_t max, mbstate_t* ps);
将多字节序列转换为宽字符
pmb 指向的多字节字符被转换为wchar_t类型的值,并存储在 pwc 指向的位置。函数返回多字节字符的字节长度。

该函数使用(并更新)由 ps 描述的转换状态。如果 ps 是一个空指针,该函数使用其自己的内部转换状态,该状态仅在调用此函数时根据需要进行更改。

如果 pmb 指向空字符,则函数会重置移位状态,并在将宽空字符存储到 pwc 后返回零。

使用空指针作为 pmb 调用该函数也会重置移位状态,忽略参数 pwcmax(没有字符存储在 pwc 处)。

此函数的行为取决于所选LC_CTYPE所选 C locale 的类别。

这是 mbtowc (<cstdlib>) 的可重入版本。

参数

pwc
指向一个wchar_t.
类型对象的指针。或者,此参数可以是一个空指针,在这种情况下,函数不存储wchar_t翻译,但仍返回多字节字符的字节长度。
pmb
指向多字节字符第一个字节的指针。
或者,可以使用空指针调用该函数,在这种情况下,函数将转换状态(ps 或其内部状态)重置为初始状态并返回零。
max
pmb 读取的最大字节数。
宏常量 MB_CUR_MAX 定义了在当前区域设置下,一个多字节字符可以包含的最大字节数。
size_t 是一个无符号整数类型。
ps
指向一个定义转换状态的 mbstate_t 对象的指针。

返回值

pmb 中用于产生宽字符的字节数。

如果这是宽空字符,或者如果 pmb 是空指针,函数返回零(在第一种情况下,宽空字符存储在 pwc 处)。

如果 pmb 的前 max 个字符构成一个不完整(但可能有效)的多字节字符,函数返回(size_t)-2(没有值存储在 pwc 处)。

否则,如果 pmb 指向的字符不构成一个有效的多字节字符(或其开头部分),函数返回(size_t)-1并设置 errnoEILSEQ(没有值存储在 pwc 处)。

请注意,size_t 是一个无符号整型类型,因此可能返回的值中没有一个是小于零的。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* mbrtowc example */
#include <wchar.h>

void printbuffer (const char* pt, size_t max)
{
  size_t length;
  wchar_t dest;
  mbstate_t mbs;

  mbrlen ( NULL, 0, &mbs );  /* initialize mbs */

  while (max>0) {
    length = mbrtowc(&dest,pt,max,&mbs);
    if ((length==0)||(length>max)) break;
    wprintf (L"[%lc]",dest);
    pt+=length; max-=length;
  }
}

int main()
{
  const char str [] = "mbrtowc example";

  printbuffer (str,sizeof(str));

  return 0;
}

函数printbuffer逐个字符地打印多字节字符串。

该示例在"C"locale 中使用了一个简单的字符串,但该函数支持支持多字节字符串的 locale。

输出

[m][b][r][t][o][w][c][ ][e][x][a][m][p][l][e]


另见