2011-10-03 5 views
12

C++ 11 introduit un nouvel ensemble de préfixes littéraux de chaîne (et permet même des suffixes définis par l'utilisateur). En plus de cela, vous pouvez utiliser directement les séquences d'échappement Unicode pour coder un certain symbole sans avoir à vous soucier de l'encodage.Littéraux de chaîne Unicode

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

Mais puis-je utiliser les séquences d'échappement unicode dans wchar_t littéraux de chaîne aussi bien? Cela semblerait être un défaut si ce n'était pas possible.

const wchar_t* sw = L"\u00DA"; 

La valeur entière de sw[0] serait bien sûr dépendre de ce que wchar_t est sur une plate-forme particulière, mais à tous les autres effets, cela devrait être portable, non?

+0

Je crois que la valeur de 'sw [0]' 'dépend de ce que wchar_t' est sur une plate-forme particulière que dans la mesure de quelle est la taille de 'wchar_t'. C'est à dire. '\ u00DA' devrait toujours produire un encodage Unicode (UTF-8, UTF-16, UTF-32) de U + 00DA, même si ce n'est pas le codage normal de la plate-forme pour ce type. – bames53

+1

En fait, ce qui précède est incorrect. L'implémentation est censée traiter les noms de caractères universels comme le ferait le caractère littéral. Donc, si l'implémentation traduit des caractères dans une chaîne de caractères littérale pour le jeu de caractères d'exécution, elle devrait le faire avec les UCN. Le codage UTF n'est garanti que si l'UCN se trouve dans un littéral Unicode (par exemple, u8 "\ u00DA"). – bames53

Répondre

8

Cela fonctionnerait, mais il peut ne pas avoir la sémantique désirée. \u00DA se développera en autant de caractères cibles que nécessaire pour l'encodage UTF8/16/32, en fonction de la taille de wchar_t, mais gardez à l'esprit que les chaînes larges n'ont aucune sémantique d'encodage documentée et garantie - elles sont simplement encodage ", sans aucune tentative de dire ce que c'est, ou obliger l'utilisateur à savoir ce que c'est.

Il est donc préférable de ne pas mélanger. Utilisez un ou l'autre, mais pas les deux, des deux:

  1. système spécifique

    : char*/"", wchar_t*/L"", \x -literals, mbstowcs/wcstombs

  2. Unicode: char*/u8"", char16_t*/u"", char32_t*/U"", \u/\U littéraux.

(Voici somerelatedquestions de mine sur le sujet.)

+0

Pour tous les détails concernant l'arrière-plan de cette question, [ce test libC++] (http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp) échoue sous Windows sur la ligne '\ x00DA'. Je me demande si je pourrais remplacer ceci avec '\ u00DA' et le faire fonctionner pour tous les' wchar_t' qui sont assez grands (ie 16 ou 32 bits) – rubenvb