Funkce mbrtowc () v C ++ převádí úzký vícebajtový znak na široký znak (typu wchar_t).
Funkce mbrtowc () je definována v hlavičkovém souboru.
mbrtowc () prototyp
size_t mbrtowc (wchar_t * pwc, const char * s, size_t n, mbstate_t * ps);
Funkce mbrtowc () převádí vícebajtový znak představovaný s na široký znak a je uložena na adrese, na kterou ukazuje pwc.
- Pokud s není null ukazatel, zkoumá se maximálně n bajtů počínaje od bajtu, na který ukazuje s, aby se určil počet bajtů potřebných k dokončení dalšího vícebajtového znaku (včetně případných posuvu).
Pokud je dalších n vícebajtových znaků v s úplné a platné, funkce jej převede na odpovídající široký znak a uloží se do umístění, na které ukazuje pwc. - Pokud s je nulový ukazatel, parametry n a pwc nemají nic společného s voláním funkce a volání je ekvivalentní
std::mbrtowc(NULL, "", 1, ps)
. - Pokud je vytvořený široký znak nulový znak, stav převodu uložený v * ps je počáteční stav posunu.
mbrtowc () parametry
- pwc: Ukazatel na adresu paměti, kde je uložen převedený široký znak.
- s: Ukazatel na vícebajtový znak, který se má převést.
- n: Maximální počet bajtů v s k prozkoumání.
- ps: Ukazatel na stav převodu použitý při interpretaci vícebajtového řetězce
mbrtowc () Návratová hodnota
Funkce mbrtowc () vrací první z následujících, které jsou platné:
- 0, pokud je široký znak převedený ze s null (pokud pwc není null).
- Počet vícebajtových znaků úspěšně převedených z s.
- -2, pokud dalších n bajtů nepředstavuje úplný vícebajtový znak.
- -1 je chyba kódování, errno je nastaveno na EILSEQ .
Příklad: Jak funguje funkce 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; )
Když spustíte program, výstup bude:
Další 1 bajt nepředstavuje úplný vícebajtový znak Dalších 5 bajtů obsahuje 2 bajty vícebajtového znaku, výsledný široký znak je µ Převedený široký znak je prázdný široký znak