mbrtowc

将当前区域设置中的多字节字符转换为等效的宽字符,使其重启功能位于多字节字符的中间。

语法

size_t mbrtowc(
   wchar_t *wchar,
   const char *mbchar,
   size_t count,
   mbstate_t *mbstate
);

参数

wchar
要接收已转换的宽字符字符串(类型 wchar_t)的宽字符的地址。 如果不需要返回任何宽字符,则此值可为 null 指针。

mbchar
字节(多字节字符)序列的地址。

count
要检查的字节数。

mbstate
指向转换状态对象的指针。 如果此值为 null 指针,则函数使用静态的内部转换状态对象。 由于内部 mbstate_t 对象不是线程安全的,建议始终传递你自己的 mbstate 参数。

返回值

以下值之一:

0 如果 wchar 不是空指针,则接下来 count 个或更少字节会填充表示 null 宽字符的多字节字符,存储在 wchar 中。

1 到 count(含)接下来 count 个或更少字节会填充有效的多字节字符。 返回的值是填充多字节字符的字节数。 如果 wchar 不是空指针,则宽字符的等效项存储在 wchar 中。

(size_t)(-1) 发生编码错误。 接下来 count 个或更少字节不参与完整且有效的多字节字符。 在这种情况下,errno 设置为 EILSEQ 且未指定 mbstate 中的转换位移状态。

(size_t)(-2) 接下来 count 个字节参与不完整但可能有效的多字节字符,所有 count 个字节均已处理。 wchar 中未存储任何值,但已更新 mbstate 以重新启动该函数。

注解

如果 mbchar 为 null 指针,则该函数等效于调用:

mbrtowc(NULL, "", 1, &mbstate)

在这种情况下,将忽略 wcharcount 参数的值。

如果 mbchar 不是空指针,则该函数会检查来自 mbcharcount 个字节以确定完成下一个多字节字符所需的字节数。 如果下一个字符是有效的,则相应的多字节字符在不是空指针时将存储在 wchar 中。 如果字符为相应的宽 null 字符,则 mbstate 结果状态是初始转换状态。

mbrtowc 函数的可重启性不同于 mbtowc_mbtowc_l。 转换状态存储在 mbstate 中,以便后续调用相同的或其他可重启函数。 混合使用可重启函数和不可重启函数时,结果不确定。 例如,如果使用 wcsrlen(而非 wcslen)的后续调用,则应用程序应使用 wcsrtombs,而不是 wcstombs

默认情况下,此函数的全局状态范围限定为应用程序。 要更改此行为,请参阅 CRT 中的全局状态

示例

将多字节字符转换为其等效的宽字符。

// 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>

另请参阅

数据转换
区域设置
多字节字符序列的解释