Funkcija mbrtowc () u C ++ pretvara uski višebajtni znak u široki znak (tipa wchar_t).
Funkcija mbrtowc () definirana je u datoteci zaglavlja.
prototip mbrtowc ()
size_t mbrtowc (wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);
Funkcija mbrtowc () pretvara višebajtni znak predstavljen s u široki znak i pohranjuje se na adresu na koju ukazuje pwc.
- Ako s nije null pokazivač, ispituje se najviše n bajtova počevši od bajta na koji pokazuje s kako bi se utvrdio broj bajtova potreban za dovršetak sljedećeg višebajtnog znaka (uključujući sve sljedove pomake).
Ako je sljedeći n višebajtni znak u s potpun i valjan, funkcija ga pretvara u odgovarajući široki znak i pohranjuje se na mjesto na koje ukazuje pwc. - Ako je s null pokazivač, parametri n i pwc nemaju nikakve veze s pozivom funkcije, a poziv je ekvivalentan
std::mbrtowc(NULL, "", 1, ps)
. - Ako je proizvedeni široki znak nulti znak, stanje pretvorbe pohranjeno u * ps početno je stanje pomaka.
mbrtowc () Parametri
- pwc: Pokazivač na memorijsku adresu na kojoj je pohranjeni pretvoreni široki znak.
- s: Pokazivač na višebajtni znak za pretvorbu.
- n: Maksimalan broj bajtova u s za ispitivanje.
- ps: pokazivač na stanje pretvorbe koje se koristi pri tumačenju višebajtnog niza
mbrtowc () Povratna vrijednost
Funkcija mbrtowc () vraća prvo od sljedećeg koje je valjano:
- 0 ako je široki znak pretvoren iz s null (ako pwc nije null).
- Broj multibajtnih znakova uspješno pretvoren iz s.
- -2 ako sljedećih n bajtova ne predstavlja cjeloviti višebajtni znak.
- -1 dolazi do pogreške kodiranja, errno je postavljeno na EILSEQ .
Primjer: Kako funkcionira funkcija 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; )
Kada pokrenete program, izlaz će biti:
Sljedećih 1 bajt (a) ne predstavljaju cjeloviti višebajtni znak Sljedećih 5 bajtova (bajtova) sadrže 2 bajta višebajtnog znaka, rezultirajući širokim znakom je µ Pretvoreni široki znak je nula široki znak