Zusammenfassung der Unicode-Programmierung
Wenn Sie von MFC- und C-Laufzeitunterstützung für Unicode profitieren möchten, müssen Sie folgende Schritte ausführen:
Define
_UNICODE
.Definieren Sie das Symbol
_UNICODE
, bevor Sie Ihr Programm erstellen.Geben Sie den Einstiegspunkt an.
Legen Sie auf der Seite "Erweitert" des Ordners "Linker" im Dialogfeld "Eigenschaftenseiten" des Projekts das Eintragspunktsymbol auf
wWinMainCRTStartup
.Verwenden Sie portable Laufzeitfunktionen und Typen.
Verwenden Sie für die Behandlung von Unicode-Zeichenfolgen die richtigen C-Laufzeitfunktionen. Sie können die
wcs
Familie der Funktionen verwenden, aber Sie bevorzugen möglicherweise die vollständig portierbaren (international aktivierten)_TCHAR
Makros. Diese Makros sind alle präfixiert_tcs
; sie ersetzen, eine für eine, für diestr
Familie der Funktionen. Diese Funktionen werden im Abschnitt "Internationalisierung" der Laufzeitbibliotheksreferenz ausführlich beschrieben. Weitere Informationen finden Sie unter Generic-Text Mappings in tchar.h.Verwendung
_TCHAR
und die zugehörigen portablen Datentypen, die unter "Unterstützung für Unicode" beschrieben sind.Bearbeiten Sie Zeichenfolgenliterale vorschriftsmäßig.
Vom Visual C++-Compiler wird ein Zeichenfolgenliteral der Form
L"this is a literal string"
als Unicode-Zeichenfolge interpretiert. Sie können dasselbe Präfix für Literalzeichen verwenden. Verwenden Sie das
_T
Makro, um literale Zeichenfolgen generisch zu codieren, sodass sie als Unicode-Zeichenfolgen unter Unicode oder als ANSI-Zeichenfolgen (einschließlich MBCS) ohne Unicode kompiliert werden. Verwenden Sie anstelle vonpWnd->SetWindowText( "Hello" );
sondern:
pWnd->SetWindowText( _T("Hello") );
Bei definitioner
_UNICODE
Definition_T
wird die Literalzeichenfolge in das L-Präfix übersetzt. Andernfalls_T
wird die Zeichenfolge ohne das Präfix L übersetzt.Tipp
Das
_T
Makro ist identisch mit dem_TEXT
Makro.Gehen Sie beim Übergeben von Zeichenfolgenlängen an Funktionen mit Bedacht vor.
Bei einigen Funktionen muss die Anzahl der Zeichen in einer Zeichenfolge angegeben werden, bei anderen Funktionen die Anzahl der Bytes. Wenn beispielsweise
_UNICODE
definiert ist, funktioniert der folgende Aufruf einesCArchive
Objekts nicht (str
ist einCString
):archive.Write( str, str.GetLength( ) ); // invalid
In einer Unicode-Anwendung gibt die Länge die Zeichenanzahl, aber nicht die richtige Byte-Anzahl an, da jedes Zeichen zwei Bytes breit ist. Sie müssen also den obigen Funktionsaufruf wie folgt ändern:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
Dieser Aufruf gibt fehlerfrei an, wie viele Bytes geschrieben werden sollen.
Zeichenorientierte MFC-Memberfunktionen arbeiten jedoch im Gegensatz zu Byte-orientierten Memberfunktionen ohne diese zusätzliche Codierung:
pDC->TextOut( str, str.GetLength( ) );
Für
CDC::TextOut
ist eine Anzahl von Zeichen, nicht eine Anzahl von Bytes erforderlich.Verwenden Sie fopen_s, _wfopen_s , um Unicode-Dateien zu öffnen.
Um zusammenzufassen, bieten MFC und die Laufzeitbibliothek die folgende Unterstützung für die Unicode-Programmierung:
Mit Ausnahme der Memberfunktionen für Datenbankklassen sind alle MFC-Funktionen, einschließlich
CString
.CString
stellt darüber hinaus Unicode/ANSI-Konvertierungsfunktionen bereit.Die Laufzeitbibliothek stellt Unicode-Versionen aller Funktionen zur Behandlung von Zeichenfolgen zur Verfügung. (Die Laufzeitbibliothek stellt auch portable Versionen zur Verfügung, die für Unicode oder FÜR MBCS geeignet sind. Dies sind die
_tcs
Makros.)tchar.h stellt tragbare Datentypen und das
_T
Makro zum Übersetzen von Literalzeichenfolgen und Zeichen bereit. Weitere Informationen finden Sie unter Generic-Text Mappings in tchar.h.Die Laufzeitbibliothek bietet eine breitformatige Version von
main
. Wird verwendetwmain
, um Ihre Anwendung Unicode-fähig zu machen.