60 votes

Source C ++ en Unicode

Quel est le codage standard du code source C ++, et le mot standard en dit-il quelque chose? Par exemple, puis-je écrire une source C ++ dans UNICODE? Vous aimez utiliser des caractères non-ASCII dans les commentaires?

Puis-je utiliser des caractères chinois dans les commentaires (l’UNICODE complet est autorisé ou uniquement la première page 16 bits ou le nom de celui-ci).

De plus, puis-je utiliser UNICODE pour les chaînes UNICODE C ++, comme par exemple:

Wstring str = L "Caractères étranges: â Čšđ ě €€";

37voto

Johannes Schaub - litb Points 256113

Le codage en C++ est un peu compliqué. Voici ma compréhension de celui-ci.

Chaque mise en charge les caractères à partir de la source de base de jeu de caractères. Ces inclure des caractères communs énumérés dans le §2.2/1 (§2.3/1 en C++11). Ces caractères doivent tous tenir dans un seul char. En outre implémentations ont à soutenir une façon de nommer les autres caractères à l'aide d'une méthode appelée universal-character-names et ressembler \uffff ou \Uffffffff et peut être utilisé pour se référer à des caractères Unicode. Une partie d'entre eux sont utilisables dans les identificateurs (énumérés à l'Annexe E).

C'est tout beau, mais le mappage de caractères dans le fichier, à la source des caractères (utilisé au moment de la compilation) est définie par l'implémentation. Ceci constitue l'encodage utilisé. Voici ce qu'il dit littéralement (C++version 98):

Source physique de fichier caractères sont mappé, la mise en œuvre définies manière, à la source de base de caractère set (introduction de caractères de nouvelle ligne pour la fin d'indicateurs de ligne) si nécessaire. Trigraph séquences (2.3) sont remplacés par les correspondants un seul caractère interne des représentations. N'importe quel fichier source caractère qui n'est pas dans la base source jeu de caractères (2.2) est remplacé par le universelle-personnage-nom qui des- ignates de ce personnage. (Un la mise en œuvre peut utiliser n'importe interne l'encodage, aussi longtemps que la réelle caractère étendu rencontrées dans la fichier source, et la même étendue caractère exprimé dans le fichier source universelle-personnage-nom (c'est à dire à l'aide de l' \uXXXX notation), sont traités de manière équivalente.)

Pour gcc, vous pouvez la modifier en utilisant l'option -finput-charset=charset. En outre, vous pouvez modifier l'exécution de caractère utilisé pour represet valeurs lors de l'exécution. La bonne option pour ce est - -fexec-charset=charset pour char (la valeur par défaut est utf-8) et -fwide-exec-charset=charset (ce qui correspond par défaut à utf-16 ou utf-32 selon la taille de l' wchar_t).

10voto

Head Geek Points 10874

La norme C++ ne dit rien sur le code source d'encodage de fichier, donc autant que je sache.

L'habitude de codage est (ou était) 7-bit ASCII -- certains compilateurs (de Borland, par exemple) rechignent à caractères ASCII qui a utilisé le peu élevé. Il n'y a pas de raison technique pour que les caractères Unicode ne peut pas être utilisé, si votre compilateur et l'éditeur de les accepter, pour la plupart, moderne, basé sur Linux, les outils, et de nombreux des meilleurs Windows éditeurs, gérer l'encodage UTF-8 sans problème, même si je ne suis pas sûr que Microsoft compilateur.

EDIT: Il semble que Microsoft compilateurs acceptent un fichier encodé en Unicode, mais il va parfois produire des erreurs sur 8 bits ASCII trop:

warning C4819: The file contains a character that cannot be represented
in the current code page (932). Save the file in Unicode format to prevent
data loss.

10voto

MSalters Points 74024

En plus de la publication de litb, MSVC ++ prend également en charge Unicode. Je comprends qu’il obtient le codage Unicode de la nomenclature. Il prend définitivement en charge des codes tels que int (*♫)(); ou const std::set<int> ∅; Si vous êtes vraiment intéressé par l'obscurcissement du code:

 typedef void ‼; // Also known as \u203C
class ooɟ {
    operator ‼() {}
};
 

6voto

Max Lybbert Points 11822

Il y a deux questions en jeu ici. La première est que les caractères sont autorisés dans le code C++ (et les commentaires), comme des noms de variables. La deuxième est que les caractères sont autorisés dans les chaînes et les littéraux de chaîne.

Comme indiqué, les compilateurs C++ doit prendre en charge un très restreinte en ASCII jeu de caractères pour les caractères autorisés dans le code et les commentaires. Dans la pratique, ce jeu de caractères ne fonctionnent pas très bien avec certains jeux de caractères (et en particulier avec l'europe, certains des claviers qui n'ont pas de quelques personnages-comme les crochets -- disponible), de sorte que le concept de bigrammes et trigraphs a été introduit. De nombreux compilateurs acceptent plus de ce jeu de caractères à ce moment, mais il n'y a pas de garantie.

Comme pour les chaînes et les littéraux de chaîne, C++ est le concept d'un caractère large et de chaîne de caractères larges. Cependant, l'encodage pour que le jeu de caractères n'est pas défini. Dans la pratique, il est presque toujours Unicode, mais je ne pense pas qu'il n'y a aucune garantie ici. Large chaîne de caractères littéraux ressembler à L"littéral de chaîne", et ceux-ci peuvent être affectés à std::wstring de l'.

4voto

Rob Points 22239

Pour encoder des chaînes, je pense que vous êtes censé utiliser la notation \ u , par exemple:

 std::wstring str = L"\u20AC"; // Euro character
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X