Funkcja mbrtowc () w C ++ konwertuje wąski znak wielobajtowy na znak szeroki (typu wchar_t).
Funkcja mbrtowc () jest zdefiniowana w pliku nagłówkowym.
Prototyp mbrtowc ()
size_t mbrtowc (wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);
Funkcja mbrtowc () konwertuje znak wielobajtowy reprezentowany przez s na znak szeroki i jest przechowywana pod adresem wskazywanym przez pwc.
- Jeśli s nie jest wskaźnikiem zerowym, sprawdzanych jest maksymalnie n bajtów, zaczynając od bajtu wskazywanego przez s, w celu określenia liczby bajtów potrzebnych do uzupełnienia następnego znaku wielobajtowego (w tym wszelkich sekwencji przesunięć).
Jeśli następny znak wielobajtowy n w s jest kompletny i poprawny, funkcja konwertuje go na odpowiedni znak szeroki i jest przechowywany w lokalizacji wskazywanej przez pwc. - Jeśli s jest pustym wskaźnikiem, parametry n oraz pwc nie mają nic wspólnego z wywołaniem funkcji, a wywołanie jest równoważne
std::mbrtowc(NULL, "", 1, ps)
. - Jeśli utworzony szeroki znak jest znakiem zerowym, stan konwersji przechowywany w * ps jest początkowym stanem przesunięcia.
mbrtowc () Parametry
- pwc: Wskaźnik do adresu pamięci, w którym jest przechowywany przekonwertowany znak szeroki.
- s: wskaźnik do znaku wielobajtowego do konwersji.
- n: Maksymalna liczba bajtów w s do zbadania.
- ps: Wskaźnik do stanu konwersji używanego podczas interpretacji ciągu wielobajtowego
mbrtowc () Wartość zwracana
Funkcja mbrtowc () zwraca pierwszą prawidłową wartość:
- 0, jeśli szeroki znak przekonwertowany z s jest null (jeśli pwc nie jest zerowy).
- Liczba znaków wielobajtowych, które zostały pomyślnie przekonwertowane z s.
- -2, jeśli następne n bajtów nie reprezentuje pełnego znaku wielobajtowego.
- -1 to błąd kodowania, errno jest ustawione na EILSEQ .
Przykład: Jak działa funkcja 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; )
Po uruchomieniu programu wynik będzie następujący:
Następny 1 bajt nie reprezentuje pełnego znaku wielobajtowego Kolejne 5 bajtów zawiera 2 bajty znaku wielobajtowego Wynikowy znak szeroki to µ Przekonwertowany znak szeroki to znak o szerokości zerowej