2009-05-21 10 views
16

Estoy tratando de escribir código de plataforma cruzada i18n C++. Como la mayoría de los sistemas Linux prefieren usar UTF-8 como codificación de caracteres, pensé que debería usar string en linux y wstring en Windows. ¿Está tchar.h disponible en Linux? ¿Qué es un reemplazo equivalente para tchar.h en Linux?tchar.h en linux

Respuesta

11

Puede encontrar el artículo this útil. En particular, cerca del final, discuten un poco sobre el uso de TCHAR y el manejo del código de Windows.

El artículo es el resumen:

TCHAR se traducirá en una amplia tipo de datos de carácter al compilar el código con el compilador de C de GNU (la mayoría de las bibliotecas portátiles definen TCHAR en sus cabeceras y se refieren a wchar_t). Esto, de hecho, fue la forma en que convertí mi programa C++ en un generador de anagramas: utilicé cadenas estándares de C++ rellenas con UTF-8 y alimenté los datos con punteros a wchar_t para las funciones de la biblioteca. Los datos UTF-8 interpretados como UTF-32 equivalen a basura (pero es tremendamente útil para la confusión de datos y errores).

+4

Para ser claros, tchar.h es solo para Windows. Pero es bastante trivial lanzar tu propio tchar.h. – Naaff

0

En realidad no es tan fácil. string.size() le dará el número de bytes UTF-8, no caracteres Unicode. Con toda justicia, wstring.size() no le dará el número de caracteres en presencia de sustitutos. Pero en la práctica, esos no se usan en aplicaciones comunes.

Por lo tanto, la respuesta real depende realmente de por qué necesita las cadenas Unicode. ¿Es solo la localización de una IU? ¿Tiene la entrada del usuario? ¿Necesitas analizar esa entrada?

0

Para construir mi fuente centrada en Windows, pude utilizar el archivo tchar.h de Cygwin que se encuentra en la carpeta cygwin \ usr \ include \ w32api.

Estoy construyendo con Android NDK. Para mis propósitos hice una copia de tchar.h y la parché.

//#include <crtdefs.h> 

#define _CRTIMP 

//#define _strninc(_pc,_sz) (((_pc)+(_sz))) 
// _CRTIMP size_t __cdecl __strncnt(const char *_Str,size_t _Cnt);