mbrtowc
Converte un carattere multibyte delle impostazioni locali correnti nel carattere wide equivalente, con la possibilità di ricominciare nel mezzo di un carattere multibyte.
Sintassi
size_t mbrtowc(
wchar_t *wchar,
const char *mbchar,
size_t count,
mbstate_t *mbstate
);
Parametri
wchar
Indirizzo di un carattere wide per ricevere la stringa di caratteri wide convertita (tipo wchar_t
). Questo valore può essere un puntatore Null se non è richiesta la restituzione di caratteri wide.
mbchar
Indirizzo di una sequenza di byte (carattere multibyte).
count
Numero di byte da controllare.
mbstate
Puntatore all'oggetto stato di conversione. Se questo valore è un puntatore Null, la funzione userà un oggetto stato di conversione interno statico. Poiché l'oggetto interno mbstate_t
non è thread-safe, è consigliabile passare sempre il proprio mbstate
argomento.
Valore restituito
Uno dei valori seguenti:
0 I byte successivi count
o minori completano il carattere multibyte che rappresenta il carattere wide Null, archiviato in wchar
, se wchar
non è un puntatore Null.
Da 1 a count
, inclusi I byte successivi count
o minori completano un carattere multibyte valido. Il valore restituito è il numero di byte che completa il carattere multibyte. L'equivalente di caratteri wide viene archiviato in wchar
, se wchar
non è un puntatore Null.
(size_t)(-1) Si è verificato un errore di codifica. I byte successivi count
o minori non contribuiscono a un carattere multibyte completo e valido. In tal caso, errno
viene impostato su EILSEQ e non viene specificato lo stato di spostamento conversione in mbstate
.
(size_t)(-2) I byte successivi count
contribuiscono a un carattere multibyte incompleto ma potenzialmente valido e tutti i count
byte sono stati elaborati. Nessun valore viene archiviato in wchar
, ma mbstate
viene aggiornato per riavviare la funzione.
Osservazioni:
Se mbchar
è un puntatore Null, la funzione è equivalente alla chiamata seguente:
mbrtowc(NULL, "", 1, &mbstate)
In questo caso, i valori degli wchar
argomenti e count
vengono ignorati.
Se mbchar
non è un puntatore Null, la funzione esamina i count
byte da mbchar
per determinare il numero di byte necessario per completare il carattere multibyte successivo. Se il carattere successivo è valido, il carattere multibyte corrispondente viene archiviato in wchar
se non è un puntatore Null. Se il carattere è il carattere wide Null corrispondente, lo stato risultante di mbstate
è lo stato di conversione iniziale.
La mbrtowc
funzione differisce da mbtowc
, _mbtowc_l
in base alla riavviibilità. Lo stato di conversione viene archiviato in mbstate
per le chiamate successive alle stesse o ad altre funzioni riavviabili. I risultati non sono definiti quando si usano insieme funzioni riavviabili e non riavviabili. Ad esempio, un'applicazione deve usare wcsrlen
anziché wcslen
se viene usata una chiamata successiva a wcsrtombs
anziché wcstombs
.
Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.
Esempio
Converte un carattere multibyte nel relativo carattere wide 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);
}
Output di esempio
Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ
Requisiti
Ciclo | Intestazione obbligatoria |
---|---|
mbrtowc |
<wchar.h> |
Vedi anche
Conversione dati
impostazioni locali
Interpretazione di sequenze di caratteri multibyte