2010-07-24 5 views
8

Je travaille avec un fichier source C++ dans lequel j'aimerais disposer d'une chaîne entre guillemets contenant des caractères Unicode asiatiques.Utilisation d'Unicode dans un fichier source C++

Je travaille avec QT sous Windows et l'environnement de développement de QT Creator n'a aucun problème à afficher l'Unicode. Les QStrings n'ont pas non plus de problème pour stocker Unicode. Quand je coller dans mon Unicode, il affiche bien, quelque chose comme:

#define MY_STRING 鸟 

Cependant, quand je sauve, mes beaux caractères Unicode tous devenus? des notes.

J'ai essayé d'ouvrir le fichier source et de le réenregistrer comme codé Unicode. Il s'affiche ensuite et enregistre correctement dans QT Creator. Cependant, lors de la compilation, il semblerait que le compilateur n'ait aucune idée de ce qu'il doit faire et lance une tonne d'erreurs et d'avertissements erronés, tels que "errance \ 255 dans le programme" et "caractère nul (s) ignoré".

Quelle est la bonne façon d'inclure Unicode dans les fichiers source C++?

+4

Quel compilateur utilisez-vous? De nombreux compilateurs (en particulier les anciens compilateurs) ne prennent pas en charge la source Unicode (les compilateurs les plus récents prendront en charge les noms de caractères universels, cependant). –

+3

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

+0

J'utilise g ++, vraisemblablement à partir de la mémoire installée par QT. –

Répondre

8

Personnellement, je n'utilise pas de caractères non-ASCII dans le code source. La raison en est que si vous utilisez des caractères Unicode arbitraires dans vos fichiers source, vous devez vous soucier de l'encodage que le compilateur considère comme le fichier source, quel jeu de caractères d'exécution il va utiliser et comment il va exécuter la source conversion de jeu de caractères.

Je pense que c'est une bien meilleure idée d'avoir des données Unicode dans un type de fichier de ressources, qui pourrait être compilé avec des données statiques au moment de la compilation ou chargé à l'exécution pour une flexibilité maximale. De cette façon, vous pouvez contrôler la façon dont l'encodage se produit, sans vous inquiéter de la façon dont le compilateur se comporte et qui peut être influencé par les paramètres régionaux locaux au moment de la compilation.

Cela nécessite un peu plus d'infrastructure, mais si vous devez vous internationaliser, cela vaut la peine de passer du temps à choisir ou développer une stratégie flexible et robuste. Bien qu'il soit possible d'utiliser des caractères d'échappement universels (L'\uXXXX') ou des séquences d'octets codés explicitement ("\xXX\xYY\xZZ") dans le code source, cela rend les chaînes Unicode pratiquement illisibles pour les humains. Si vous faites faire des traductions, il est plus facile pour la plupart des personnes impliquées dans le processus de traiter du texte dans un système de codage de caractères universel convenu.

2

Utilisez-vous une interface wchar_t? Si c'est le cas, vous voulez L"\u1234" pour une chaîne large contenant le caractère Unicode U + 1234 (hex 0x1234). (Si vous regardez le fichier d'en-tête QString, je pense que c'est ce dont vous avez besoin.)

Si ce n'est pas le cas et que votre interface est UTF-8, vous devez d'abord encoder votre personnage en UTF-8 puis créer une chaîne étroite contenant cela, par exemple "\xE0\xF8" ou similaire.

5

En utilisant le préfixe L et \u ou \U notation pour échapper à des caractères Unicode:

Section 6.4.3 of the C99 specification définit les \u séquences d'échappement.

Exemple:

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

** 'U + 8801' ** est [Unicode Han Caractère 'larves, larves] (http://www.fileformat.info/info/unicode/char/8801/index.htm). Dans votre exemple, avez-vous plutôt l'intention d'utiliser un personnage de [Unicode Characters dans la catégorie 'Symbol, Math'] (http://www.fileformat.info/info/unicode/category/Sm/list.htm)? – DavidRR

+1

@DavidRR: Cela [a beaucoup plus de sens] (http://www.fileformat.info/info/unicode/char/2261/index.htm). La notation Unicode est en hexadécimal. Peut-être que Heath confondait cette notation avec HTML, qui est décimal par défaut. – usr2564301

+0

@Jongware: Oui, bonne prise. Heath a probablement prévu «\ u2261» (IDENTICAL TO). – DavidRR

Questions connexes