Compartilhar via


mbrtowc

Converta um caractere de vários byte no caractere largo equivalente.

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

Parâmetros

  • wchar
    Endereço de um caractere largo para receber a seqüência de caracteres largos convertido (tipo de wchar_t). Esse valor pode ser NULL Se nenhum caractere largo de retorno for necessário.

  • mbchar
    Endereço de uma sequência de bytes (caractere multibyte).

  • count
    Número de bytes para verificar.

  • mbstate
    Estado de conversão.Se esse valor for nulo, uma categoria de estado interno de conversão é usada.

Valor de retorno

  • 0
    Se o próximo count ou menos bytes concluir caracteres multibyte que representa o NULL caractere largo.

  • > 0
    Se o próximo count ou menos bytes concluir um caractere válido de vários bytes, o valor retornado é o número de bytes que completar caracteres multibyte.

  • -1
    Se ocorrer um erro de codificação, que nesse caso o próximo count ou menos bytes não contribuem para os caractere multibyte completo e válido, o valor errno será EILSEQ e o estado de conversão ambíguo.

  • -2
    Se o próximo count bytes contribuem para um multibyte incompleta e contagem de todos os bytes tenham sido processados.

Comentários

If wcharis a NULL value, the function is equivalent to the call:

mbrtowc(NULL, NULL, 1, mbstate)

Nesse caso, o valor dos argumentos wchar e count são ignorados.

If wchar is not NULL, the function examines count bytes from mbcharto determine the required number of bytes needed to complete the next multibyte character.Se o próximo caractere for válido, os caracteres multibyte correspondente é armazenada no wchar Se não for nulo. Se o caractere for o caractere nulo ampla correspondente, o estado resultante é o estado inicial de conversão.

The mbrtowc função difere mbtowc, _mbtowc_l por sua capacidade de reinicialização. O estado de conversão é armazenado em mbstate para chamadas subseqüentes para o mesmo ou Outros funções reinicializáveis. Os resultados são indefinidos ao misturar o uso de funções nonrestartable e reinicializáveis.Por exemplo, um aplicativo utilize wcsrlen em vez de wcslen, se uma telefonar subseqüente para wcsrtombs Quando usado em vez de wcstombs.

Exemplo

Converte um caracteres multibyte em seu equivalente de caractere largo.

// 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);
}

Saída de exemplo

Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ

Requisitos

Rotina

Cabeçalho necessário

mbrtowc

<wchar.h>

Equivalente do NET Framework

Não aplicável. Para telefonar a função C padrão, use PInvoke. Para obter mais informações, consulte Exemplos de invocação de plataforma.

Consulte também

Referência

Conversão de Dados

Localidade

Interpretação de seqüências de caractere multibyte