Функція 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 байти багатобайтового символу. Результат широкого символу µ Перетворений широкий символ є нульовим широким символом