mbrtowc
Преобразовать символ multi-байта в эквивалентный расширенный символ.
size_t mbrtowc(
wchar_t *wchar,
const char *mbchar,
size_t count,
mbstate_t mbstate
);
Параметры
wchar
Адрес расширенных символов для получения преобразованную характерную черту расширенных символов (тип wchar_t).Это значение может быть NULL если возвращаемый символ необходим расширенный.mbchar
Адрес последовательности байтов (многобайтового символов).count
Количество байтов, которое необходимо проверить.mbstate
Состояние преобразования.Если это значение равно null, то категории состояния внутреннего преобразования.
Возвращаемое значение
0
Если следующая count или меньше байтов, завершаются символ, представляющий многобайтовый NULL расширенный символ.> 0
Если следующая count или меньше байтов, завершаются допустимый символ многобайтовый, возвращается значение число байтов, которые завершаются многобайтовый символ.-1
Если ошибка кодирования, то в этом случае следующие действия count или меньшее число байтов не участвуют в полное и допустимы многобайтовый символ значение errno будет EILSEQ и состоянием преобразования неоднозначным.-2
Если следующая count байты в неполное multibyte и все байты количества обработаны.
Заметки
If wcharзначение Null, функция эквивалентно вызову:
mbrtowc(NULL, NULL, 1, mbstate)
В этом случае значения аргументов wchar и count пропустить.
If wchar НЕ ПУСТА, функция учитывает count байты из mbcharнеобходимости необходимое число байтов, необходимых для завершения следующий многобайтовый символ.Если следующий знак является допустимым, то соответствующий символ сохраняется в многобайтовый wchar если он НЕ ПУСТ.Если символ, соответствующий широкий нуль-символ, то результирующее состояние начальное состояние преобразования.
mbrtowc функция отличается от mbtowc, _mbtowc_l по restartability.Состояние преобразования сохраняется в пределах mbstate для последующих вызовов этой же или другой прерываемый функциям.Смешивание использование результаты не определены прерываемых и nonrestartable функций.Например, приложение использовал бы wcsrlen вместо wcslenесли последующий вызов wcsrtombs где используется вместо wcstombs.
Пример
Преобразование многобайтовый символ в его эквивалент юникода.
// 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);
}
Пример результатов выполнения
Locale set to: "French_Canada.1252"
Conversion succeeded!
Multibyte String: AaBbCcÜïα∩≡xXyYzZ
WC String: AaBbCcÜïα∩≡xXyYzZ
Требования
Процедура |
Обязательный заголовок |
---|---|
mbrtowc |
<wchar.h> |
Эквивалент в .NET Framework
Неприменимо. Для c# используйте стандартная функция PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.