2009-08-21 11 views
5

Estoy programando una nueva aplicación (hobby personal) para Windows en C++.Iniciar una nueva aplicación de Windows: ¿Debo usar _TCHAR o wchar_t para el texto?

En las cosas anteriores de bajo nivel de Windows, he usado _TCHAR (o solo TCHAR) matrices/cadenas_básicas para la manipulación de cadenas.

¿Hay alguna ventaja de utilizar _TCHAR más hacia arriba de Unicode con wchar_t, si no se preocupan por las plataformas de Windows pre Win2k?


edición: después de presentar descubrí una pregunta similar aquí desde octubre de 2008:

Is TCHAR still relevant?

parece ser más consenso ahora sobre zanjas TCHAR

Respuesta

13

No, no hay. Solo ve con wchar_t.

TCHAR solo es útil si desea poder usar un conmutador de compilación condicional para convertir su programa para operar en modo ASCII. Como Win2K y las plataformas superiores son unicode, este modificador no proporciona ningún valor. En cambio, estarías implicando a otros desarrolladores en tu proyecto que ASCII era un objetivo válido cuando en realidad no lo es.

+0

+1. Pero no entiendo el comentario sobre ASCII que no es un objetivo válido ...? Si usa TCHAR correctamente, lo es, pero acepto que no parece necesario en este contexto. –

+1

@Kim: Creo que el punto que Jared está tratando de plantear es que si kibibu está considerando reemplazar TCHAR con wchar_t, su intención es que el programa sea solo Unicode (ya que usar wchar_t lo encerraría en Unicode). En ese sentido, ASCII sería un objetivo inválido en el sentido de que el programador no quiere que el programa use ASCII (el uso de TCHAR implicaría que el programador está bien con ASCII o Unicode). – GRB

+1

Esto, combinado con el punto de jalf sobre la interfaz con librerías que no son Windows, son probablemente los bits más importantes en mi opinión. El hecho de que el código diga TCHAR no significa que se ejecutará o incluso compilará en modo ANSI cuando interactúe con otras bibliotecas. – kibibu

8

wchar_t es un tipo definido de C++, que es de 16 bits en Visual Studio, pero tiene 32 bits en varios compiladores de gcc. Siempre es capaz de mantener un punto de código Unicode.

TCHAR y _TCHAR no son caracteres "Unicode" - ayúdales destinado a ser utilizado en el código que puede ser compilado y/o utilizados en Unicode o ANSI programas:

_TCHAR es - de su líder subrayado - un Microsoft C runtime library "extension" al estándar C++. _TCHAR cuando se define _UNICODE, debe ser un carácter de 16 bits, cuando se define _MBCS, ser un carácter multibyte, y cuando ninguno está definido, debe ser un carácter de un solo byte. Utilice este tipo si utiliza las funciones de cadena definidas por MS CRT que tienen el prefijo _t: _tcscpy(), por ejemplo, es el reemplazo de strcpy()/wcscpy().

TCHAR es definido por la API de Win32. Este tipo es CHAR cuando UNICODE no está definido, y WCHAR cuando se define UNICODE (tenga en cuenta la falta de un guión bajo en este tipo). Las funciones de API de Windows que toman cadenas también esperan cadenas WCHAR en UNICODE compilaciones y CHAR cadenas en compilaciones no unicode.

En resumen:

  • wchar_t es una multiplataforma C++ tipo definido que puede contener un punto de código Unicode - en compiladores distintos de Microsoft, es con frecuencia de 32 bits de ancho.
  • _TCHAR es un tipo definido Microsoft que se empareja con las funciones de tiempo de ejecución _tcs* c que cambia su tipo basado en la definición de _UNICODE y/o _MBCS.
  • TCHAR es un tipo definido por la API de Windows que cambia su tipo según la definición (o no) de UNICODE.
  • WCHAR es el tipo de API de Windows nativo para tratar cadenas de caracteres unicode. Al usar un conjunto de herramientas de GCC para compilar el código de Windows, tendrá 16 bits de ancho, donde wchar_t podría no serlo.

¿Eso ayuda? No lo sé.

+0

Ciertamente sí.¿El uso de TCHARs con las funciones _tcs * interrumpe las cosas en las plataformas MBCS? – kibibu

+0

¿Romper cosas? No. Siempre y cuando se asegure de que _UNICODE está definido si UNICODE es y/o _MBCS está definido cuando UNICODE no lo está, entonces los tipos de Win32 y los tipos de "prueba" CRT cambiarán al unísono para ser compatibles. Win32 no se molesta en definir un 'modo' MBCS explícito como - su decisión no era tratar los conjuntos de caracteres multibyte de un solo byte de forma diferente. –

4

me gustaría ir con sencillo wchar_t

La ventaja de TCHAR es que le permite alternar Unicode de encendido y apagado y el código de acceso a la API de Windows va a seguir trabajando.

El problema con él es que ninguna otra API lo aceptará.

std::cout se ahogue en un std :: wstring , std :: string se ahogue al ser inicializado con un wchar_t* y así sucesivamente.

Desde el punto de vista de cualquier otra biblioteca, debe usar ya sea char o wchar_t, y el cambio entre ellas no es trivial.

Y como la compatibilidad con Unicode no era realmente un problema en Windows 95, realmente no tiene sentido seguir soportando ambas cosas. Habilite Unicode, use wchar_t y ahórrese los dolores de cabeza.

Por supuesto, para evitar confusiones, es posible que también desee llamar a las * versiones W de las funciones de Win32. En lugar de CreateWindow, CreateWindowW, por ejemplo, de modo que incluso si alguien compila su código con Unicode deshabilitado en la configuración del proyecto, el código seguirá funcionando. Si va a hardcode para compatibilidad con Unicode, también puede hacerlo de forma consistente.

+0

No había considerado el problema de std :: cout, pero no planeo usar la salida de la consola de todos modos. – kibibu

+2

bueno, eso es solo un ejemplo. El mismo problema aparece en la mayoría del resto de la biblioteca estándar. Tienes que usar 'string' o' wstring'. No hay "tstring" a menos que lo defina usted mismo. Las transmisiones de archivos también. 'wifstream' contra' ifstream'. El punto es que * nada * fuera de la API de Win32 permite el mismo "podría ser' char', podría ser agnosticismo 'wchar_t', lo que hace que no tenga sentido usar TCHAR hoy. Fue útil cuando Microsoft presentó la compatibilidad con Unicode, de regreso Windows 95/98. Hoy en día, causa una serie de problemas, pero los beneficios no existen. – jalf

+1

Sí, quise añadir que hay muchas otras bibliotecas que requieren una u otra _explícitamente_, por lo que TCHAR es más ofuscación que otra cosa. La pregunta surgió inicialmente porque estaba mirando la lib de texto de Pango, que usa cadenas UTF-8 pasadas como char *. Usando TCHAR tendría que esparcir #ifdefs o definir una macro PANGO_ENCODE para que funcione sin hacer el TCHAR simplemente una envoltura sin sentido alrededor de wchar_t de todas formas. Voy a usar GDI + en su lugar. – kibibu

-2

Usar TCHAR. Abre su aplicación para escenarios de despliegue UNICODE y no UNICODE. Por supuesto, hay más dolor con las conversiones de cadenas y el uso de funciones de manipulación de cadenas estándar.

+1

¿Hay alguna Escenario de implementación en unicode ¿De qué me debería preocupar ahora? – kibibu

0

Si siempre compila su aplicación para Unicode mientras la está desarrollando, NO FUNCIONARÁ cuando se compile para cadenas ANSI, incluso si está atestada de TCHAR. (Las aplicaciones de juguete con excepción).

Eso es lo que JaredPar estaba diciendo cuando dijo que ANSI no es un objetivo válido. Si desea mantener las versiones de Unicode y ANSI, puede usar TCHAR para hacerlo, pero el solo uso de TCHAR y otras T no lo llevará hasta allí; debe crear y mantener activamente ambas versiones. Definitivamente no vale la pena más para la mayoría de las aplicaciones.

Cuestiones relacionadas