Le codage Unicode pour les littéraux de chaîne en C++11
À la suite d'une une question relative à la, j'aimerais poser des questions sur le nouveau personnage et littéral de chaîne types en C++11. Il semble que nous avons maintenant quatre sortes de personnages et cinq sortes de littéraux de chaîne. Les types de caractères:
char a = '\x30'; //character, no semantics
wchar_t b = L'\xFFEF'; //wide character, no semantics
char16_t c = u'\u00F6'; //16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; //32-bit, assumed UCS-4
Et les littéraux de chaîne:
char A[] = "Hello\x0A"; //byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; //wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; //(1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; //(2)
auto E[] = u8"\u00F6\U0010FFFF"; //(3)
La question est celle-ci: le \x
/\u
/\U
références de caractère librement combinable avec tous les types de chaînes? Sont tous les types de chaînes de largeur fixe, c'est à dire les tableaux contiennent précisément que de nombreux éléments apparaissent dans le littéral, ou à \x
/\u
/\U
références obtenir étendue en un nombre variable d'octets? Ne u""
et u8""
chaînes de codage sémantique, par exemple, je peux dire char16_t x[] = u"\U0010FFFF"
, et la non-BMP codepoint encodés dans un de deux unité UTF16 séquence? Et de même pour u8
? Dans (1), puis-je écrire solitaire mères porteuses avec \u
? Enfin, les fonctions de chaîne de codage de courant (c'est à dire qu'ils sont de caractère conscient et peut détecter des invalides les séquences d'octets)?
C'est un peu une question ouverte, mais j'aimerais obtenir une image aussi complète que possible de la nouvelle UTF-encodage et le type des installations de la nouvelle C++11.
- GCC ne codent
u"\U0010FFFF"
dans une paire de substitution. - Quelles sont
x
u
etU
en liesse sur?
Vous devez vous connecter pour publier un commentaire.
Pas.
\x
peut être utilisé dans n'importe quoi, mais\u
et\U
ne peut être utilisé dans des chaînes de caractères qui sont spécifiquement UTF. Toutefois, pour toute UTF-chaîne codée,\u
et\U
peut être utilisé comme bon vous semble.Pas dans le sens que tu veux dire.
\x
,\u
, et\U
sont convertis sur la base du codage de la chaîne. Le nombre de ces "unités de code" (Unicode à l'aide de termes. Unchar16_t
est un code UTF-16 unité) valeurs dépend de l'encodage de la chaîne. Le littéralu8"\u1024"
serait de créer une chaîne de caractères contenant 2char
s plus d'un terminateur null. Le littéralu"\u1024"
serait de créer une chaîne de caractères contenant 1char16_t
plus un terminateur null.Le nombre d'unités de code utilisé est basé sur le codage Unicode.
u""
crée une codé en UTF-16 de la chaîne.u8""
crée une codé en UTF-8 chaîne. Ils seront codés par la spécification Unicode.Absolument pas. La spécification expressément interdit l'utilisation de l'UTF-16 paires de substitution (0xD800-0xDFFF) comme codepoints pour
\u
ou\U
.Absolument pas. Eh bien, permettez-moi de reformuler ce que.
std::basic_string
ne pas traiter avec des encodages Unicode. Certainement ils peuvent magasin UTF-chaînes codées. Mais ils ne peuvent penser à eux comme des séquences dechar
,char16_t
, ouchar32_t
; ils ne peuvent pas penser à eux comme une séquence d'Unicode codepoints qui sont codés avec un mécanisme particulier.basic_string::length()
retourne le nombre d'unités de code, pas de points de code. Et bien évidemment, la bibliothèque standard C fonctions de chaînes de caractères sont totalement inutilesIl convient de noter toutefois que la "longueur" pour une chaîne Unicode ne signifie pas que le nombre de codepoints. Quelques points de code sont en combinant "caractères" (un malheureux nom), qui se combinent avec la précédente codepoint. Afin de multiples codepoints peut correspondre à un seul caractère visuel.
Iostreams peut en effet lire/écrire encodés en Unicode valeurs. Pour ce faire, vous devrez utiliser les paramètres régionaux pour spécifier l'encodage et bien imprégner dans les différents lieux. C'est plus facile à dire qu'à faire, et je n'ai pas de code sur moi pour vous montrer comment faire.
\x
ne peut pas être utilisé avec n'importe quoi, par exemple U+1F984 ne fonctionnera pas avec le \x préfixe, et\u
et\U
ne peut pas être utilisé avec des caractères de contrôle ASCII, au moins dans Clang.