Est u8 littéral de chaîne nécessaire en C++11
De Wikipedia:
Pour but d'améliorer le support de l'Unicode dans les compilateurs C++, la définition du type char a été modifiée pour être au moins de la taille nécessaire pour stocker les huit bits du codage UTF-8.
Je me demande exactement ce que cela signifie pour l'écriture d'applications portables. Quelle est la différence entre l'écriture de ce
const char[] str = "Test String";
ou cela?
const char[] str = u8"Test String";
Est-il une raison de ne pas utiliser ce dernier pour chaque littéral de chaîne dans votre code?
Ce qui se passe quand il y a des non-ASCII des Caractères à l'intérieur de la chaîne de Test?
stackoverflow.com/questions/9739070/char-encoding peut-être être utile
L'une des chaînes est en UTF-8, l'autre pourrait être n'importe quoi, comme EBCDIC.
Peut-être d'intérêt -- codage des questions relatives à la mienne: #1, #2, #3
L'une des chaînes est en UTF-8, l'autre pourrait être n'importe quoi, comme EBCDIC.
Peut-être d'intérêt -- codage des questions relatives à la mienne: #1, #2, #3
OriginalL'auteur Lukas Schmelzeisen | 2012-11-18
Vous devez vous connecter pour publier un commentaire.
L'encodage de
"Test String"
est la mise en œuvre définies par le système de codage (l'étroit, éventuellement multi-octets).L'encodage de
u8"Test String"
est toujours UTF-8.Les exemples ne sont pas très révélateur. Si vous avez inclus certains Unicode littéraux (comme
\U0010FFFF
) dans la chaîne, puis vous obtenez toujours ceux (UTF-8), mais qu'ils peuvent être exprimés dans le système-chaîne codée, et si oui, quelle est leur valeur, est mise en œuvre définies.Si cela peut aider, imaginez que vous êtes la création de la source code EBCDIC de la machine. Puis le littéral "Chaîne de Test" est toujours EBCDIC codé dans le fichier source lui-même, mais le
u8
-initialisé le tableau contient des codé en UTF-8 valeurs, alors que le premier tableau contient EBCDIC codé valeurs.OriginalL'auteur
Vous citer Wikipédia:
Bien, “dans le but de” c'est des conneries.
char
a toujours été garantis au moins 8 bits, qui est,CHAR_BIT
a toujours été nécessaire pour être ≥à 8, en raison de l'autonomie requise pourchar
dans le C standard. Qui est (citation de C++11 §17.5.1.5/1) “incorporé” dans la norme C++.Si je dois deviner sur la but de ce changement de libellé, il serait juste de clarifier les choses pour les lecteurs ignorants de la dépendance sur le C standard.
Ce qui concerne l'effet de la
u8
littérale préfixe, ilaffecte l'encodage de la chaîne dans le fichier exécutable, mais
malheureusement, il ne pas une incidence sur le type.
Ainsi, dans les deux cas
"tørrfisk"
etu8"tørrfisk"
vous obtenez unchar const[n]
. Mais dans le premier littéral de l'encodage est celui qui est sélectionné pour le compilateur, par exemple, avec le Latin 1 (ou Windows ANSI Ouest), à 8 octets pour les caractères plus une nullbyte, pour la taille du tableau 9. Tandis que dans le dernier littérale de l'encodage est garanti d'être en UTF-8, où le “ø” sera codé avec 2 ou 3 octets (je ne me souviens pas exactement), pour augmenter légèrement la taille de la matrice.OriginalL'auteur
Le compilateur choisit un encodage natif naturel de la plate-forme. Sur les systèmes POSIX, il ne sera probablement choisir ASCII et quelque chose, éventuellement, en fonction de l'environnement de réglage pour les valeurs de caractères en dehors de la plage ASCII. Sur des mainframes il va probablement choisir EBCDIC. La comparaison de chaînes reçues, par exemple, à partir de fichiers ou de la ligne de commande sera probablement mieux avec le natif de jeu de caractères. Lors du traitement de fichiers explicitement codé en UTF-8, vous êtes, cependant, probablement le meilleur off à l'aide de
u8"..."
chaînes.Cela dit, avec les changements récents concernant l'encodage des caractères d'une hypothèse fondamentale de traitement de chaîne en C et C++ s'est cassé: chaque caractère interne de l'objet (
char
,wchar_t
, etc.) utilisé pour représenter un caractère. Ce n'est évidemment pas vrai pour une chaîne UTF-8 whee chaque caractère de l'objet représente un octet de certains caractères. En conséquence, toutes les manipulation de chaîne de caractère, de classification, etc. les fonctions ne sont pas nécessairement travailler sur ces chaînes. Nous n'avons pas toute bonne bibliothèque de la queue pour faire face à de tels chaînes pour inclusion dans la norme.Je ne suis pas nécessairement en désaccord avec le fait que les chaînes de caractères sont utilisés depuis un certain temps à tenir encodage multi-octet, mais la norme n'ai pas reconnaître ce fait et traitées en interne des caractères comme l'une des unités. Tous les équipements standard de traitement de chaînes de caractères ne continuent de se comporter comme si les caractères ne sont qu'une seule unité! Par exemple, il n'a pas vraiment beaucoup de sens d'avoir
s.substr(b, n)
si le début et/ou à la fin de la sous-chaîne peut être au milieu d'un caractère Unicode. Mêmewchar_t
chaînes de caractères à largeur fixe comme il y a, par exemple, les combinaisons de caractères.la norme ne reconnaissent pas cet état de fait", je pense que tu veux dire dans la bibliothèque de fonctions. la norme c++ lui-même a toujours reconnu l'existence de plusieurs octets (par personnage) les chaînes de caractères. par exemple, il recommande/nécessaire (je ne me souviens pas exactement lequel) que
main
arguments sont MBCSes, qui est l'endroit où les Fenêtres convention, n'est pas-ou, où la norme n'avait pas de normaliser la pratique existante... 😉Non, la norme reconnaît encodages multi-octets, y compris dans la bibliothèque. Par exemple, le code de conversion les facettes peuvent gérer illégale séquences, pas de suffisamment d'espace pour stocker le multi-octets de la représentation d'un caractère large, etc. Plusieurs caractères par wchar_t sont reconnues et traitées dans de nombreux endroits. Le problème avec
s.substr(b,n)
n'est pas un problème avec la bibliothèque, c'est un problème avec le programmeur de croire qu'il fonctionne au niveau du caractère, plutôt que, comme il est spécifié, dans le code au niveau de l'unité.Mon commentaire sur Unicode fondamentalement casser quoi "largeur fixe" signifie a propos de la question avec des caractères composés, entre autres choses. À la lumière de l'Unicode wchar_t est assez bien worthless.
OriginalL'auteur
Si le d'exécution de jeu de caractères du compilateur est configuré en UTF-8, il ne fait aucune différence si
u8
est utilisé ou pas, puisque le compilateur convertit les caractères en UTF-8 dans les deux cas.Toutefois, si les compilateurs de l'exécution par le jeu de caractères du système non UTF8, codepage (par défaut, par exemple Visual C++), puis les caractères non ASCII peut ne pas être correctement gérée lorsque
u8
est omis. Par exemple, la conversion de l'échelle de chaînes de collision par exemple, dans VS15:OriginalL'auteur