Souhrn programování s kódem Unicode
Chcete-li využít knihovnu MFC a podporu jazyka C za běhu pro kódování Unicode, je třeba:
Definovat _UNICODE.
Definovat symbol _UNICODE před sestavením programu.
Určit vstupní bod.
Na stránce Výstup složky propojovacího programu v dialogovém okně Stránky vlastností projektu, nastavte symbol vstupního bodu wWinMainCRTStartup.
Použijte přenositelné běhové funkce a typy.
Použijte vhodné běhové funkce jazyka C pro zpracování řetězce kódování Unicode.Můžete použít rodinu funkcí wcs, ale pravděpodobně budete preferovat plně přenositelné (mezinárodně povolené) makra _TCHAR.Tato makra jsou všechny s předponou _tcs; navzájem se nahrazují pro rodinu funkcí str.Tyto funkce jsou podrobně popsány v sekci InternacionalizaceReference běhové knihovny.Další informace naleznete v tématu Mapování obecného textu v Tchar.h.
Použijte _TCHAR a související přenositelné datové typy popsané v tématu Podpora kódování Unicode.
Vhodné zpracování řetězcových literálů
Kompilátor jazyka Visual C++ interpretuje řetězcový literál kódovaný jako:
L"this is a literal string"
pro porozumění řetězce znaků kódování Unicode.Můžete použít stejnou předponou pro literální znaky.Použijte makro _T k obecnému zakódování řetězcových literálů, takže jsou kompilovány jako řetězce Unicode v kódování Unicode nebo řetězce ANSI (včetně znakové sady MBCS) bez kódování Unicode.Například namísto kódu:
pWnd->SetWindowText( "Hello" );
použití:
pWnd->SetWindowText( _T("Hello") );
S definovaným _UNICODE, překládá _T řetězcový literál do formy předpony L; jinak _T převede řetězec bez předpony L.
Tip
Makro _T je totožné s makrem _TEXT.
Předávejte opatrně délky řetězců funkcím.
Některé funkce chtějí počet znaků v řetězci; ostatní chtějí počet bajtů.Například pokud je definován _UNICODE, následující volání objektu CArchive nebude fungovat (str je CString):
archive.Write( str, str.GetLength( ) ); // invalid
V Unicode aplikaci Vám délka poskytne počet znaků, ale nesprávný počet bajtů, protože každý znak je dvoubajtový.Místo toho musíte použít:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
který určuje správný počet bajtů pro zápis.
Avšak členské funkce knihovny MFC, které jsou zaměřené na znak, spíše než na bajt, pracují bez extra kódování:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut bere počet znaků, ne počet bajtů.
Použijte fopen_s, _wfopen_s pro otevření souborů kódování Unicode.
Pro shrnutí, knihovna MFC a běhová knihovna, obsahují následující podporu programování kódování Unicode v systému Windows 2000:
S výjimkou členských funkcí databázové třídy, podporují všechny funkce knihovny MFC kódování Unicode, včetně CString. CString také poskytuje funkce převodu Unicode/ANSI.
Běhová knihovna poskytuje Unicode verze všech funkcí, které zpracovávají řetězec. (Běhová knihovna také poskytuje přenositelné verze vhodné pro kódování Unicode nebo znakovou sadu MBCS.Jedná se o makra _tcs.)
Tchar.h poskytuje přenositelné datové typy a makro _T pro převod řetězcových literálů a literálů znaků.Další informace naleznete v tématu Mapování obecného textu v Tchar.h.
Běhová knihovna obsahuje verze širokého znaku main.Použijte wmain pro nastavení rozpoznávání kódování Unicode v aplikaci.