À l'aide de l'Unicode dans le code source C++
Quelle est la norme de codage de code source C++? Le standard C++ même dire quelque chose à ce sujet? Puis-je écrire de source C++ en Unicode?
Par exemple, puis-je utiliser des caractères non-ASCII comme les caractères Chinois dans les commentaires? Si oui, est-Unicode complète permis ou seulement un sous-ensemble de l'Unicode? (par exemple, que les 16 bits de la première page ou quelque chose comme ça.)
Par ailleurs, puis-je utiliser l'Unicode pour les chaînes? Par exemple:
Wstring str=L"Strange chars: â Țđ ě €€";
- RE: "quelque chose comme ça": Wikipedia: Le premier avion, l'avion 0, Basic Multilingual Plane (BMP) contient les caractères de presque toutes les langues modernes, et un grand nombre de symboles. L'objectif principal de la BMP est de soutenir l'unification de l'avant les jeux de caractères ainsi que les caractères de l'écriture. La plupart du code assigné points dans les BMP sont utilisés pour coder Chinois, Japonais et coréen (CJK) caractères.
Vous devez vous connecter pour publier un commentaire.
Codage en C++ est un peu compliqué. Voici ma compréhension de celui-ci.
Chaque mise en charge les caractères 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 toutes s'inscrivent dans une
char
. En outre implémentations ont à soutenir une façon de nommer les autres caractères à l'aide d'une méthode appeléeuniversal-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):
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. Le bon choix pour ce qui est-fexec-charset=charset
pour char (la valeur par défaut estutf-8
) et-fwide-exec-charset=charset
(qui, par défaut, soitutf-16
ouutf-32
en fonction de la taille dewchar_t
).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:
En plus de litb post, MSVC++ prend en charge Unicode trop. Je comprends qu'il obtient le codage Unicode à partir de la NOMENCLATURE. Il a certainement prend en charge le code comme
int (*♫)();
ouconst std::set<int> ∅;
Si vous êtes vraiment dans le code obfuscuation:
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 soutien très limité 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'.
C++11 a ajouté la prise en charge explicite des chaînes Unicode et les littéraux de chaîne, codé en UTF-8, UTF-16 big endian, UTF-16 little endian, UTF-32 big endian et UTF-32 little-endian.
Pour l'encodage dans les chaînes, je pense que vous êtes censé utiliser le \u notation, par exemple:
Il est également intéressant de noter que l'échelle de caractères en C++ ne sont pas vraiment des chaînes Unicode en tant que tel. Ils sont simplement des chaînes de caractères plus grands, généralement de 16 ans, mais parfois 32 bits. Cette mise en œuvre est définie, bien que, autant que je me souvienne, vous pouvez avoir un 8-bit
wchar_t
Vous n'avez pas de réelle garantie quant à l'encodage en eux, donc si vous essayez de faire quelque chose comme: traitement de texte, vous voudrez probablement un typedef la plus adaptée au type entier à votre Unicode entité.C++1x a plus de support de l'unicode sous la forme de l'encodage UTF-8 littéraux de chaîne (
u8"text"
), et UTF-16 et UTF-32 types de données (char16_t
etchar32_t
IIRC) et les constantes de chaîne (u"text"
etU"text"
). Le codage de caractères spécifié sans\uxxxx
ou\Uxxxxxxxx
constantes est toujours de mise en œuvre-défini, même si (et il n'y a pas de support d'encodage pour des complexes de la chaîne types de l'extérieur de la littéraux)u
seulement pour les personnages?Dans ce contexte, si vous obtenez MSVC++ erreur c4819 avertissement, il suffit de modifier le fichier source de l'encodage "UTF-8 avec Bom".
GCC 4.1 ne supporte pas cela, mais GCC 4.4, et le dernier Qt version utilise GCC 4.4, afin de l'utiliser "UTF-8 avec Bom" que le fichier source de codage.
Autant que je sache, Il n'est pas normalisé, comme vous pouvez le mettre n'importe quel type de caractères dans les chaînes étendues.
Vous avez juste à vérifier que votre compilateur est d'Unicode code source pour le faire marcher droit.