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.