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 mbtowc
reinicializaçã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