Partilhar via


mbrtowc

Converta um caractere multibyte na localidade atual no caractere largo equivalente, com a capacidade de reiniciar no meio de um caractere multibyte.

Sintaxe

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 cadeia de caracteres largos convertida (tipo wchar_t). Esse valor poderá ser um ponteiro nulo se não for necessário nenhum caractere largo de retorno.

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

count
O número de bytes a serem verificados.

mbstate
O ponteiro para um objeto do estado da conversão. Se esse valor for um ponteiro nulo, a função usará um objeto de estado de conversão interna estática. Como o objeto interno mbstate_t não é thread-safe, recomendamos que você sempre passe seu próprio mbstate argumento.

Valor retornado

Um dos seguintes valores:

0 Os bytes seguintes count ou menores completam o caractere multibyte que representa o caractere largo nulo, que é armazenado em wchar, se wchar não for um ponteiro nulo.

1 a count, inclusive Os bytes seguintes count ou menores completam um caractere multibyte válido. O valor retornado é o número de bytes que completa os caracteres multibyte. O equivalente de caractere largo é armazenado em wchar, se wchar não for um ponteiro nulo.

(size_t)(-1) Erro de codificação. Os próximos count bytes ou menos bytes não contribuem para um caractere multibyte completo e válido. Nesse caso, errno é definido como EILSEQ e o estado de deslocamento da conversão em mbstate não é especificado.

(size_t)(-2) Os próximos count bytes contribuem para um caractere multibyte incompleto, mas potencialmente válido, e todos os count bytes foram processados. Nenhum valor é armazenado em wchar, mas mbstate é atualizado para reiniciar a função.

Comentários

Se mbchar for um ponteiro nulo, a função será equivalente à chamada:

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

Nesse caso, os wchar valores dos argumentos and count são ignorados.

Se mbchar não for um ponteiro nulo, a função examinará count bytes de mbchar para 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, o caractere multibyte correspondente será armazenado se wchar não for um ponteiro nulo. Se o caractere for o caractere nulo largo correspondente, o estado resultante de mbstate será o estado de conversão inicial.

A mbrtowc função difere de , _mbtowc_l por sua capacidade de mbtowcreinicialização. O estado da conversão é armazenado em mbstate para chamadas posteriores às mesmas funções ou a outras funções reiniciáveis. Os resultados são indefinidos ao combinar o uso de funções reiniciáveis e não reiniciáveis. Por exemplo, um aplicativo deverá usar wcsrlen em vez de wcslen se uma chamada subsequente para wcsrtombs for usada em vez de wcstombs.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.

Exemplo

Converte um caractere multibyte em seu caractere largo equivalente.

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

Confira também

Conversão de dados
Localidade
Interpretação de sequências de caracteres multibyte