2010-07-24 23 views
8

Estoy trabajando con un archivo fuente C++ en el que me gustaría tener una cadena entrecomillada que contenga caracteres Unicode asiáticos.Uso de Unicode en un archivo fuente C++

Estoy trabajando con QT en Windows, y el entorno de desarrollo de QT Creator no tiene problemas para mostrar el Unicode. Los QStrings tampoco tienen problemas para almacenar Unicode. Cuando me pega en mi Unicode, se muestra bien, algo así como:

#define MY_STRING 鸟 

Sin embargo, al guardar, mis caracteres Unicode encantador todo convertido? marcas.

He intentado abrir el archivo de origen y guardarlo como codificado en Unicode. A continuación, muestra y guarda correctamente en QT Creator. Sin embargo, en compilación, parece que el compilador no tiene idea de qué hacer con esto, y arroja una tonelada de errores y advertencias equivocadas, como "parásitos \ 255 en el programa" y "caracteres nulos ignorados".

¿Cuál es la forma correcta de incluir Unicode en los archivos fuente de C++?

+4

Qué compilador está usando? Muchos compiladores (especialmente los compiladores más antiguos) no son compatibles con la fuente Unicode (sin embargo, los compiladores más recientes admiten nombres de caracteres universales). –

+3

http://stackoverflow.com/questions/331690/c-source-in-unicode –

+0

Estoy usando g ++, presumiblemente del mingw instalado por QT. –

Respuesta

8

Personalmente, no uso caracteres no ASCII en el código fuente. La razón es que si usa caracteres Unicode arbitrarios en sus archivos fuente, debe preocuparse por la codificación en la que el compilador considera que está el archivo fuente, qué conjunto de caracteres de ejecución utilizará y cómo se ejecutará el código fuente para la ejecución. juego de caracteres de conversión.

Creo que es una idea mucho mejor tener datos Unicode en algún tipo de archivo de recursos, que podrían compilarse a datos estáticos en tiempo de compilación o cargarse en tiempo de ejecución para una flexibilidad máxima. De esta forma puede controlar cómo se produce la codificación, sin preocuparse por cómo se comporta el compilador, lo que puede verse influido por la configuración del entorno local en el momento de la compilación.

Requiere un poco más de infraestructura, pero si tiene que internacionalizarse, vale la pena perder el tiempo eligiendo o desarrollando una estrategia flexible y robusta.

Si bien es posible usar escapes de caracteres universales (L'\uXXXX') o secuencias de bytes codificadas explícitamente ("\xXX\xYY\xZZ") en código fuente, esto hace que las cadenas Unicode sean prácticamente ilegibles para humanos. Si realiza traducciones, es más fácil para la mayoría de las personas involucradas en el proceso tratar el texto en un esquema de codificación de caracteres universal acordado.

2

¿Está utilizando una interfaz wchar_t? Si es así, quiere L"\u1234" para una cadena ancha que contenga el carácter Unicode U + 1234 (hex 0x1234). (Mirando el archivo de encabezado QString, creo que esto es lo que necesita)

Si no es así y su interfaz es UTF-8, primero deberá codificar su carácter en UTF-8 y luego crear una cadena estrecha que contenga eso, por ejemplo "\xE0\xF8" o similar.

5

Uso de la L prefijo y \u o \U notación para escapar caracteres Unicode:

Section 6.4.3 of the C99 specification define las \u secuencias de escape.

Ejemplo:

#define MY_STRING L"A \u8801 B" 
/* A congruent-to B */ 
+1

** 'U + 8801' ** es [larvas, gusanos] de Unicode Han Character '(http://www.fileformat.info/info/unicode/char/8801/index.htm). En su ejemplo, ¿tuvo la intención de utilizar un carácter de [Caracteres Unicode en la categoría 'Símbolo, Matemáticas'] (http://www.fileformat.info/info/unicode/category/Sm/list.htm)? – DavidRR

+1

@DavidRR: Eso [tiene mucho más sentido] (http://www.fileformat.info/info/unicode/char/2261/index.htm). La notación Unicode está en hexadecimal. Quizás Heath estaba confundiendo esta notación con HTML, que es decimal por defecto. – usr2564301

+0

@Jongware: Sí, buena captura. Heath probablemente pretendía '\ u2261' (IDENTICAL TO). – DavidRR

Cuestiones relacionadas