Функция mbrtowc () в C ++ преобразует узкий многобайтовый символ в широкий символ (типа wchar_t).
Функция mbrtowc () определена в заголовочном файле.
mbrtowc () прототип
size_t mbrtowc (wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);
Функция mbrtowc () преобразует многобайтовый символ, представленный s, в широкий символ и сохраняется в адресе, на который указывает pwc.
- Если s не является нулевым указателем, проверяется максимум n байтов, начиная с байта, на который указывает s, чтобы определить количество байтов, необходимых для завершения следующего многобайтового символа (включая любые последовательности сдвига).
Если следующий n многобайтовых символов в s является полным и допустимым, функция преобразует его в соответствующий широкий символ и сохраняется в месте, указанном pwc. - Если s - нулевой указатель, параметры n и pwc не имеют ничего общего с вызовом функции, и этот вызов эквивалентен
std::mbrtowc(NULL, "", 1, ps)
. - Если созданный широкий символ является нулевым символом, состояние преобразования, сохраненное в * ps, является начальным состоянием сдвига.
Параметры mbrtowc ()
- pwc: указатель на адрес памяти, где хранится преобразованный широкий символ.
- s: указатель на многобайтовый символ для преобразования.
- n: максимальное количество байтов в s для проверки.
- ps: указатель на состояние преобразования, используемый при интерпретации многобайтовой строки
mbrtowc () Возвращаемое значение
Функция mbrtowc () возвращает первое из следующих допустимых значений:
- 0, если широкий символ, преобразованный из s, равен нулю (если pwc не равно нулю).
- Количество многобайтовых символов, успешно преобразованных из s.
- -2, если следующие n байтов не представляют собой полный многобайтовый символ.
- -1 - произошла ошибка кодирования, для errno задано значение EILSEQ .
Пример: как работает функция mbrtowc ()?
#include #include #include using namespace std; void test_mbrtowc(const char *s, size_t n) ( mbstate_t ps = mbstate_t(); wchar_t wc; int retVal = mbrtowc(&wc, s, n, &ps); if (retVal == -2) wcout << L"Next " << n << L" byte(s) doesn't represent a complete multibyte character" << endl; else if (retVal == -1) wcout << L"Next " << n << L" byte(s) doesn't represent a valid multibyte character" << endl; else if (retVal == 0) wcout << L"The converted wide character is a null wide character" << endl; else ( wcout << L"Next " << n << L" byte(s) hold " << retVal << L" bytes of multibyte character, "; wcout << L"Resulting wide character is " << wc << endl; ) ) int main() ( setlocale(LC_ALL, "en_US.utf8"); char str1() = "u00b5"; char str2() = " "; test_mbrtowc(str1, 1); test_mbrtowc(str1, 5); test_mbrtowc(str2, 5); return 0; )
Когда вы запустите программу, вывод будет:
Следующий 1 байт (ы) не представляет собой полный многобайтовый символ Следующие 5 байтов содержат 2 байта многобайтового символа, результирующий широкий символ µ Преобразованный широкий символ является нулевым широким символом