2010-07-24 11 views
8

Sto lavorando con un file di origine C++ in cui mi piacerebbe avere una stringa quotata contenente caratteri Unicode asiatici.Utilizzo di Unicode in un file di origine C++

Sto lavorando con QT su Windows e l'ambiente di sviluppo di QT Creator non ha problemi a visualizzare Unicode. Anche QStrings non ha problemi a memorizzare Unicode. Quando mi incollo nel mio Unicode, visualizza bene, qualcosa di simile:

#define MY_STRING 鸟 

Tuttavia, quando salvo, i miei bei caratteri Unicode diventati tutti? segni.

Ho provato ad aprire il file sorgente e lo salvavo come codificato in Unicode. Quindi viene visualizzato e salvato correttamente in QT Creator. Tuttavia, in fase di compilazione, sembra che il compilatore non abbia idea di cosa fare con questo, e lancia una tonnellata di errori e avvertimenti errati, come "stray \ 255 in program" e "null character (s) ignored".

Qual è il modo corretto di includere Unicode nei file di origine C++?

+4

Cosa compilatore stai usando? Molti compilatori (specialmente i compilatori più vecchi) non supportano l'origine unicode (i compilatori più recenti supporteranno nomi di caratteri universali, comunque). –

+3

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

+0

Sto usando g ++, presumibilmente dal mingw installato da QT. –

risposta

8

Personalmente, non uso alcun carattere non ASCII nel codice sorgente. La ragione è che se si usano i caratteri Unicode arbitari nei file sorgente, ci si deve preoccupare della codifica in cui il compilatore considera il file sorgente, quale set di caratteri di esecuzione userà e come farà l'origine all'esecuzione conversione del set di caratteri.

Penso che sia un'idea molto migliore avere dati Unicode in una sorta di file di risorse, che potrebbe essere compilato in dati statici in fase di compilazione o caricato in fase di esecuzione per la massima flessibilità. In questo modo è possibile controllare come si verifica la codifica, non preoccuparsi di come si comporta il compilatore che può influenzare le impostazioni locali locali in fase di compilazione.

Richiede un'infrastruttura un po 'più, ma se devi internazionalizzare vale la pena dedicare del tempo a scegliere o sviluppare una strategia flessibile e solida.

Mentre è possibile utilizzare fughe Universal Character (L'\uXXXX') o sequenze di byte esplicitamente codificate ("\xXX\xYY\xZZ") nel codice sorgente, questo rende le stringhe Unicode praticamente illeggibile per gli esseri umani. Se si stanno facendo traduzioni, è più facile per la maggior parte delle persone coinvolte nel processo essere in grado di gestire il testo in uno schema di codifica universale condiviso.

2

Si sta utilizzando un'interfaccia wchar_t? In tal caso, si desidera L"\u1234" per una stringa ampia contenente il carattere Unicode U + 1234 (esadecimale 0x1234). (Guardando il file di intestazione QString penso che questo sia quello che ti serve.)

Se no e la tua interfaccia è UTF-8 devi prima codificare il tuo carattere in UTF-8 e poi creare una stringa stretta contenente questo, ad es "\xE0\xF8" o simile.

5

Utilizzando il prefisso L e \u o \U notazione per sfuggire caratteri Unicode:

Section 6.4.3 of the C99 specification definisce le \u sequenze di escape.

Esempio:

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

** 'U + 8801' ** è [larve di Unicode Han Character ', grubs'] (http://www.fileformat.info/info/unicode/char/8801/index.htm). Nel tuo esempio, hai invece intenzione di utilizzare un carattere da [Caratteri Unicode nella categoria 'Symbol, Math'] (http://www.fileformat.info/info/unicode/category/Sm/list.htm)? – DavidRR

+1

@DavidRR: Questo [ha molto più senso] (http://www.fileformat.info/info/unicode/char/2261/index.htm). La notazione Unicode è in esadecimale. Forse Heath stava confondendo questa notazione con l'HTML, che è decimale di default. – usr2564301

+0

@Jongware: Sì, buona cattura. Heath probabilmente intendeva '\ u2261' (IDENTICO A). – DavidRR

Problemi correlati