Partilhar via


mbrtowc

Converta um caractere de vários bytes 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 retorno caractere largos for necessário.

  • mbchar
    Endereço de uma seqüência de bytes (caracteres multibyte).

  • count
    Número de bytes para verificar.

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

Valor de retorno

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

  • > 0
    Se o próximo count ou menos bytes concluir um caractere multibyte válido, o valor retornado é o número de bytes que completam a 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 caracteres multibyte completo e válido, o valor de errno será EILSEQ e o estado de conversão ambíguo.

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

Comentários

Se wcharé um valor nulo valor, a função é equivalente à chamada:

mbrtowc(NULL, NULL, 1, mbstate)

Neste caso, o valor dos argumentos wchar e count são ignoradas.

Se wchar não for nulo, a função examina count bytes de mbcharpara determinar o número necessário de bytes necessários para concluir o próximo caractere multibyte.Se o próximo caractere for válido, os caracteres multibyte correspondente é armazenado em wchar se ele não for nulo.Se o caractere é o caractere nulo de ampla correspondente, o estado resultante é o estado inicial de conversão.

O 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 outras funções reinicializáveis.Os resultados são indefinidos ao combinar o uso de funções reiniciáveis e não reiniciável.Por exemplo, um aplicativo deve usar wcsrlen em vez de wcslen, se uma chamada subseqüente para wcsrtombs onde 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>

Equivalência do .NET Framework

Não aplicável. Para chamar 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 caracteres Multibyte