Funkcia mbrtowc () v C ++ prevádza úzky viacbajtový znak na široký znak (typu wchar_t).
Funkcia mbrtowc () je definovaná v hlavičkovom súbore.
mbrtowc () prototyp
size_t mbrtowc (wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);
Funkcia mbrtowc () prevádza viacbajtový znak predstavovaný s na široký znak a je uložená na adrese, na ktorú ukazuje pwc.
- Ak s nie je nulový ukazovateľ, skúma sa maximálne n bajtov začínajúcich od bajtu, na ktorý ukazuje s, aby sa určil počet bajtov potrebný na dokončenie ďalšieho viacbytového znaku (vrátane akýchkoľvek posúvacích sekvencií).
Ak je ďalších n viacbajtových znakov v s úplné a platné, funkcia ho prevedie na zodpovedajúci široký znak a uloží sa na miesto, na ktoré ukazuje pwc. - Ak je s nulový ukazovateľ, parametre n a pwc nemajú nič spoločné s volaním funkcie a volanie je ekvivalentné s
std::mbrtowc(NULL, "", 1, ps)
. - Ak je produkovaný široký znak nulový znak, stav konverzie uložený v * ps je počiatočný stav posunu.
Parametre mbrtowc ()
- pwc: Ukazovateľ na adresu pamäte, kde je uložený prevedený široký znak.
- s: Ukazovateľ na viacbajtový znak, ktorý sa má previesť.
- n: Maximálny počet bajtov v s na preskúmanie.
- ps: Ukazovateľ na stav konverzie použitý pri interpretácii viacbytového reťazca
mbrtowc () Vrátená hodnota
Funkcia mbrtowc () vráti prvý z nasledujúcich platných:
- 0, ak je široký znak prepočítaný zo s null (ak pwc null nie je).
- Počet viacbajtových znakov úspešne prevedených z s.
- -2, ak nasledujúcich n bajtov nepredstavuje úplný viacbajtový znak.
- -1 je chyba kódovania, errno je nastavené na EILSEQ .
Príklad: Ako funguje funkcia 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 spustení programu bude výstup:
Nasledujúcich 1 bajtov nepredstavuje úplný viacbajtový znak Nasledujúcich 5 bajtov obsahuje 2 bajty viacbajtového znaku, výsledný široký znak je µ Konvertovaný široký znak je prázdny široký znak