Tengo que estar de acuerdo con Sascha. La premisa subyacente de TCHAR
/ _T()
/ etc. es que puede escribir una aplicación basada en "ANSI" y luego mágicamente darle soporte Unicode definiendo una macro. Pero esto se basa en varias suposiciones erróneas:
Que construya activamente versiones MBCS y Unicode de su software
De lo contrario, se equivocará y utilizará char*
cuerdas normales en muchos lugares.
Que no use escapes de barra invertida no ASCII en literales _T ("...")
A menos que su codificación "ANSI" sea ISO-8859-1, el resultado char*
y los wchar_t*
literales no representarán los mismos caracteres.
Que las cadenas UTF-16 se utilizan como cadenas "ANSI"
Ellos no están. Unicode introduce varios conceptos que no existen en la mayoría de las codificaciones de caracteres heredadas. Sustitutos. Combinando personajes. Normalización. Reglas de mayúsculas y minúsculas condicionales y sensibles al idioma.
Y quizás lo más importante, el hecho de que UTF-16 rara vez se guarda en disco o se envía a través de Internet: UTF-8 tiende a ser preferido para la representación externa.
Que tu aplicación no usa Internet
(Ahora, esto puede ser una suposición válida para su software, pero ...)
La web se ejecuta en UTF-8 y una gran cantidad de codificaciones más raras . El TCHAR
concepto solo reconoce dos: "ANSI" (que no puede ser UTF-8 ) y "Unicode" (UTF-16). Puede ser útil para hacer que sus llamadas API de Windows sean compatibles con Unicode, pero es muy inútil para hacer que sus aplicaciones web y de correo electrónico sean compatibles con Unicode.
Que no use bibliotecas que no sean de Microsoft
Nadie más lo usa TCHAR
. Poco usa std::string
y UTF-8. SQLite tiene versiones UTF-8 y UTF-16 de su API, pero no TCHAR
. TCHAR
ni siquiera está en la biblioteca estándar, así que no, a std::tcout
menos que quieras definirlo tú mismo.
Lo que recomiendo en lugar de TCHAR
Olvídese de que existen codificaciones "ANSI", excepto cuando necesita leer un archivo que no es válido en UTF-8. Olvídate TCHAR
también. Llame siempre a la versión "W" de las funciones de la API de Windows. #define _UNICODE
solo para asegurarse de no llamar accidentalmente a una función "A".
Utilice siempre codificaciones UTF para cadenas: UTF-8 para char
cadenas y UTF-16 (en Windows) o UTF-32 (en sistemas similares a Unix) para wchar_t
cadenas. typedef
UTF16
y UTF32
tipos de personajes para evitar diferencias de plataforma.