Ich muss Sascha zustimmen. Die zugrunde liegende Prämisse von TCHAR
/_T()
/ etc. ist, dass Sie eine "ANSI" -basierte Anwendung schreiben und ihr dann auf magische Weise Unicode-Unterstützung geben können, indem Sie ein Makro definieren. Dies basiert jedoch auf mehreren schlechten Annahmen:
Dass Sie aktiv sowohl MBCS- als auch Unicode-Versionen Ihrer Software erstellen
Andernfalls Sie wird nach oben rutschen und verwenden gewöhnlichechar*
Strings in vielen Orten.
Dass Sie keinen Nicht-ASCII-Backslash verwenden, wird in _T ("...") - Literalen maskiert
Sofern Ihre "ANSI" -Codierung nicht ISO-8859-1 ist, repräsentieren das Ergebnis char*
und die wchar_t*
Literale nicht dieselben Zeichen.
Diese UTF-16-Zeichenfolgen werden genau wie "ANSI" -Strings verwendet
Sie sind nicht. Unicode führt verschiedene Konzepte ein, die in den meisten älteren Zeichenkodierungen nicht vorhanden sind. Surrogate. Charaktere kombinieren. Normalisierung. Bedingte und sprachempfindliche Gehäuseregeln.
Und vielleicht am wichtigsten ist die Tatsache, dass UTF-16 selten auf der Festplatte gespeichert oder über das Internet gesendet wird: UTF-8 wird für die externe Darstellung bevorzugt.
Dass Ihre Anwendung das Internet nicht nutzt
(Nun, dies kann eine gültige Annahme für Ihre Software sein, aber ...)
Das Web läuft auf UTF-8 und einer Vielzahl seltener Codierungen . Das TCHAR
Konzept erkennt nur zwei: "ANSI" (das kann nicht UTF-8 sein ) und "Unicode" (UTF-16). Es kann nützlich sein, um Ihre Windows-API-Aufrufe Unicode-fähig zu machen, aber es ist verdammt nutzlos, um Ihre Web- und E-Mail-Apps Unicode-fähig zu machen.
Dass Sie keine Nicht-Microsoft-Bibliotheken verwenden
Niemand sonst benutzt TCHAR
. Poco verwendet std::string
und UTF-8. SQLite hat UTF-8- und UTF-16-Versionen seiner API, aber nein TCHAR
. TCHAR
ist nicht einmal in der Standardbibliothek, also neinstd::tcout
sei denn, Sie möchten es selbst definieren.
Was ich anstelle von TCHAR empfehle
Vergessen Sie, dass "ANSI" -Codierungen vorhanden sind, außer wenn Sie eine Datei lesen müssen, die nicht für UTF-8 gültig ist. Vergiss es TCHAR
auch. Rufen Sie immer die "W" -Version der Windows-API-Funktionen auf. #define _UNICODE
Nur um sicherzustellen, dass Sie nicht versehentlich eine "A" -Funktion aufrufen.
Verwenden Sie immer UTF-Codierungen für Zeichenfolgen: UTF-8 für char
Zeichenfolgen und UTF-16 (unter Windows) oder UTF-32 (auf Unix-ähnlichen Systemen) für wchar_t
Zeichenfolgen. typedef
UTF16
und UTF32
Zeichentypen, um Plattformunterschiede zu vermeiden.