Souhrn programování s kódem Unicode
Pokud chcete využít podporu prostředí MFC a běhu jazyka C pro Unicode, musíte:
Definovat
_UNICODE
.Před sestavením programu definujte symbol
_UNICODE
.Zadejte vstupní bod.
Na stránce Upřesnit složky Linker v dialogovém okně Stránky vlastností projektu nastavte symbol vstupního bodu na
wWinMainCRTStartup
.Používejte přenosné funkce a typy za běhu.
Pro zpracování řetězců Unicode použijte správné funkce běhu jazyka C. Můžete použít
wcs
řadu funkcí, ale možná dáváte přednost plně přenosným (mezinárodně povoleným)_TCHAR
makrům. Všechna tato makra mají předponu_tcs
; nahrazují jednu za jedno prostr
řadu funkcí. Tyto funkce jsou podrobně popsány v části Mezinárodní inicializace v referenční dokumentaci knihovny run-time. Další informace naleznete v tématu Mapování obecného textu v tchar.h.Používejte
_TCHAR
a související přenosné datové typy popsané v tématu Podpora kódování Unicode.Správně zpracovává řetězce literálů.
Kompilátor Jazyka Visual C++ interpretuje literálový řetězec kódovaný jako:
L"this is a literal string"
znaménkou znaky Unicode. Stejnou předponu můžete použít pro literální znaky.
_T
Makro použijte k kódování literálových řetězců obecně, takže se kompilují jako řetězce Unicode v kódování Unicode nebo jako řetězce ANSI (včetně MBCS) bez unicode. Například místo:pWnd->SetWindowText( "Hello" );
použijte:
pWnd->SetWindowText( _T("Hello") );
Při
_UNICODE
definování_T
přeloží literálový řetězec do formuláře s předponou L. V opačném případě_T
přeloží řetězec bez předpony L.Tip
Makro
_T
je shodné s_TEXT
makrem.Dávejte pozor při předávání délky řetězců funkcím.
Některé funkce chtějí počet znaků v řetězci; ostatní chtějí počet bajtů. Pokud
_UNICODE
je například definováno, následující volání objektuCArchive
nebude fungovat (str
jeCString
):archive.Write( str, str.GetLength( ) ); // invalid
V aplikaci Unicode poskytuje délka počet znaků, ale ne správný počet bajtů, protože každý znak je široký 2 bajty. Místo toho musíte použít:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
určuje správný počet bajtů k zápisu.
Členské funkce MFC, které jsou orientované na znaky, nikoli na bajty, ale fungují bez tohoto dodatečného kódování:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut
přebírá několik znaků, nikoli počet bajtů.K otevření souborů Unicode použijte fopen_s _wfopen_s .
Prostředí MFC a knihovna runtime poskytují následující podporu programování v kódování Unicode:
Kromě členských funkcí třídy databáze jsou všechny funkce MFC povolené kódování Unicode, včetně
CString
.CString
poskytuje také funkce převodu Unicode/ANSI.Knihovna za běhu poskytuje verze Unicode všech funkcí pro zpracování řetězců. (Knihovna za běhu také poskytuje přenosné verze vhodné pro Unicode nebo PRO MBCS. Toto jsou
_tcs
makra.)tchar.h poskytuje přenosné datové typy a
_T
makro pro překlad literálových řetězců a znaků. Další informace naleznete v tématu Mapování obecného textu v tchar.h.Knihovna runtime poskytuje širokoznakovou verzi
main
. Používáwmain
se k tomu, aby vaše aplikace věděla unicode.