c++ linux internationalization tchar

c++ - tchar.h en linux



internationalization (3)

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


En realidad no es tan fácil. string.size () le dará el número de bytes UTF-8, no caracteres Unicode. Para ser justos, wstring.size () tampoco te dará el número de caracteres en presencia de sustitutos. Pero en la práctica, esos no se utilizan en aplicaciones comunes.

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


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

En realidad estoy construyendo usando 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);


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

El resumen del artículo es:

TCHAR se convertirá en un tipo de datos de caracteres amplios al compilar este código con el Compilador GNU C (la mayoría de las bibliotecas portátiles definen TCHAR en sus encabezados y se refieren a wchar_t). De hecho, así fue como convertí mi programa C ++ en un generador de anagramas: usé cadenas C ++ estándar rellenas con UTF-8 y alimenté los datos con punteros convertidos en wchar_t a funciones de biblioteca. Los datos UTF-8 interpretados como UTF-32 equivalen a basura (pero es tremendamente útil para la ofuscación de datos y errores).