mbrtowc
转换多字节字符转换为等效的宽字符。
size_t mbrtowc(
wchar_t *wchar,
const char *mbchar,
size_t count,
mbstate_t mbstate
);
参数
wchar
接收转换后的宽字符字符串的宽字符的地址 (类型 wchar_t)。; 如果没有返回宽字符需要,该值可以是 NULL 。mbchar
序列的地址字节 (多字节字符)。count
检查的字节数。mbstate
转换状态。如果此值为空,使用内部转换状态类别。
返回值
0
如果下 count 或更低字节完成表示 NULL 宽字符的多字节字符。> 0
如果下 count 或更低字节完成有效的多字节字符,返回的值是完成多字节字符的字节数。-1
如果编码错误,,在下 count 或更低字节不会导致完整有效的多字节字符情况下, errno 值将为 EILSEQ 和不明确转换的状态。-2
如果下一个 count 字节导致不完整的多字节和所有计数字节处理。
备注
如果 wchar空值,将函数与调用等效:
mbrtowc(NULL, NULL, 1, mbstate)
在这种情况下,参数 wchar 的值和 count 被忽略。
如果 wchar 不为空,该功能检查从 mbchar的 count 字节命令式所需的字节数完成下多字节字符。如果下一个字符是有效的,对应的多字节字符在 wchar 存储,如果不为空。如果该字符是相应的宽度 null 字符,结果状态是初始转换状态。
mbrtowc 功能与 mbtowc, _mbtowc_l 不同由其 restartability。转换状态中的 mbstate 存储的后续调用相同或其他可重新启动的功能。,混合使用可重新启动和 nonrestartable 函数时,结果是未定义的。例如,因此,如果以后对 wcsrtombs 效果位置而不是 wcstombs,应用程序将使用 wcsrlen 而不是 wcslen。
示例
转换多字节字符转换为宽字符等效。
// crt_mbrtowc.cpp
#include <stdio.h>
#include <mbctype.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
#define BUF_SIZE 100
int Sample(char* szIn, wchar_t* wcOut, int nMax)
{
mbstate_t state = {0}; // Initial state
size_t nConvResult,
nmbLen = 0,
nwcLen = 0;
wchar_t* wcCur = wcOut;
wchar_t* wcEnd = wcCur + nMax;
const char* mbCur = szIn;
const char* mbEnd = mbCur + strlen(mbCur) + 1;
char* szLocal;
// Sets all locale to French_Canada.1252
szLocal = setlocale(LC_ALL, "French_Canada.1252");
if (!szLocal)
{
printf("The fuction setlocale(LC_ALL, \"French_Canada.1252\") failed!\n");
return 1;
}
printf("Locale set to: \"%s\"\n", szLocal);
// Sets the code page associated current locale's code page
// from a previous call to setlocale.
if (_setmbcp(_MB_CP_SBCS) == -1)
{
printf("The fuction _setmbcp(_MB_CP_SBCS) failed!");
return 1;
}
while ((mbCur < mbEnd) && (wcCur < wcEnd))
{
//
nConvResult = mbrtowc(wcCur, mbCur, 1, &state);
switch (nConvResult)
{
case 0:
{ // done
printf("Conversion succeeded!\nMultibyte String: ");
printf(szIn);
printf("\nWC String: ");
wprintf(wcOut);
printf("\n");
mbCur = mbEnd;
break;
}
case -1:
{ // encoding error
printf("The call to mbrtowc has detected an encoding error.\n");
mbCur = mbEnd;
break;
}
case -2:
{ // incomplete character
if (!mbsinit(&state))
{
printf("Currently in middle of mb conversion, state = %x\n", state);
// state will contain data regarding lead byte of mb character
}
++nmbLen;
++mbCur;
break;
}
default:
{
if (nConvResult > 2) // The multibyte should never be larger than 2
{
printf("Error: The size of the converted multibyte is %d.\n", nConvResult);
}
++nmbLen;
++nwcLen;
++wcCur;
++mbCur;
break;
}
}
}
return 0;
}
int main(int argc, char* argv[])
{
char mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";
wchar_t wcBuf[BUF_SIZE] = {L''};
return Sample(mbBuf, wcBuf, BUF_SIZE);
}
示例输出
Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ
要求
实例 |
必需的头 |
---|---|
mbrtowc |
wchar.h |
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见 平台调用示例。