10
votes

Quelle est la différence entre "utf-16" et "std :: wstring"?

Y a-t-il une différence entre ces deux formats de stockage de chaînes?


1 commentaires

Il y a une assez bonne réponse à cette question ici: Stackoverflow.com/Questions / 402283 / STDWSTRING-VS-STDSRING / ...


3 Réponses :


2
votes

utf-16 est un concept de texte représenté dans des éléments de 16 bits, mais un caractère textuel réel peut consister en plusieurs éléments

std :: wstring n'est qu'une collection de ces éléments et est une classe principalement concernée par leur stockage.

Les éléments d'un wstring, wchar_t est d'au moins 16 bits mais pourraient être 32 bits.


4 commentaires

Pouvez-vous s'il vous plaît expliquer plus en détail, comme donner un exemple. Par exemple, le personnage 'A' est stocké dans STD :: wstring comme "0x0041". Comment est-il stocké au format UTF-16?


16- octet ?? Woah c'est un personnage hardcore codant


@ Inverse: C'est pourquoi tout le monde devrait simplement utiliser ASCII, il n'y aurait pas tant de chagrin sur la mémoire;)


Pour ceux qui peuvent ne pas comprendre l'humour dans les commentaires ci-dessus, UF-16 est un 16- bit codage unicode. En outre, dans UTF-16, un caractère défini en utilisant plusieurs éléments de 16 bits est effectué ainsi via paires de substitution .



6
votes

UTF-16 est un codage spécifique Unicode. std :: wstring est une implémentation de chaîne utilisant wchar_t comme type sous-jacent pour stocker chaque caractère. (En revanche, régulier std :: string utilise char ).

Le codage utilisé avec wchar_t ne doit pas nécessairement être utf-16-il pourrait également être utf-32 par exemple.


1 commentaires

Cela pourrait aussi être UCS-2 ou S-JIS ou BIG 5 ou ... Eh bien, n'importe quoi.



15
votes

std :: wstring est un conteneur de wchar_t . La taille de wchar_t n'est pas spécifié-windows compilateurs a tendance à utiliser un type de 16 bits, un système Unix un type 32 bits.

utf-16 est un moyen de coder de séquences de points de code Unicode dans des séquences de Entiers de 16 bits.

Utilisation de Visual Studio, si vous utilisez des littéraux de caractères larges (par exemple, L "Hello World" ) qui ne contient aucun caractère en dehors du BMP , vous vous retrouverez avec UTF-16, mais surtout les deux concepts ne sont pas liés. Si vous utilisez des caractères en dehors du BMP, std :: wstring ne traduira pas paires de substitution dans des points de code Unicode pour vous, même si wchar_t est de 16 bits.


4 commentaires

Voulez-vous dire que STD :: wstring est identique à UTF-16 pour seul le caractère non-BMP Unicode lorsqu'il est utilisé dans le système d'exploitation Windows?


N ° STD :: wstring n'est qu'un conteneur d'entiers. Le codage du conteneur dépend entièrement des données que vous insérez dans le conteneur.


+1: Pour les personnes inconnues avec UTF, il peut être sage de définir BMP.


Votre dernier paragraphe est la réponse à ma question. Merci.