33 votes

UTF8 vs UTF16 vs char* vs quoi? Quelqu'un expliquer ce gâchis pour moi!

J'ai réussi à la plupart d'ignorer ces caractères multi-octets trucs, mais maintenant, j'ai besoin de faire une INTERFACE utilisateur de travailler, et je sais que mon ignorance dans ce domaine va rattraper avec moi! Quelqu'un peut-il expliquer en quelques paragraphes ou moins juste ce que j'ai besoin de savoir afin que je puisse localiser mes applications? Quels types dois-je utiliser (j'utilise les deux .Net et C/C++, et j'ai besoin de cette réponse pour Unix et Windows).

76voto

Dylan Beattie Points 23222

Découvrez Joel Spolsky est Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères (Pas d'Excuses!)

EDIT 20140523: Aussi, regarder des Caractères, des Symboles et de l'Unicode Miracle par Tom Scott sur YouTube - c'est un peu moins de dix minutes, et une merveilleuse explication de la brillante "hack" c'est de l'UTF-8

25voto

Brian R. Bondy Points 141769

Un codage de caractères est une séquence de codes que chaque regard d'un symbole à partir d'un jeu de caractères donné. Veuillez voir ce bon article sur Wikipedia sur l'encodage des caractères.

UTF8 (UCS) utilise 1 à 4 octets pour chaque symbole. Wikipédia donne un bon aperçu de la façon dont le multi-octets aperçu des œuvres:

  • Le bit le plus significatif de caractères à un octet est toujours 0.
  • Les bits les plus significatifs du premier octet d'un multi-octet de la séquence déterminer la longueur de la séquence. Ces bits les plus significatifs sont 110 les deux séquences d'octets; 1110 pour trois séquences d'octets, et ainsi de suite.
  • Les octets restants dans un multi-octet de la séquence 10 que leurs deux plus bits significatifs.
  • UTF-8 flux de données contient ni l'octet FE ni FF. Cela permet de s'assurer qu'un UTF-8 flux ne regarde jamais comme UTF-16 flux en commençant par U+FEFF (Byte-order mark)

La page vous montre également une bonne comparaison entre les avantages et les inconvénients de chaque type de codage des caractères.

UTF16 (UCS2)

Utilise 2 octets 4 octets pour chaque symbole.

UTF32 (UCS4)

utilise 4 octets toujours pour chaque symbole.

char signifie simplement un octet de données et n'est pas un codage réel. Il n'est pas analogue à UTF8/UTF16/ascii. Un char* pointeur peut se référer à n'importe quel type de données et à n'importe quel encodage.

STL:

Les deux stl std::wstring et std::string ne sont pas conçus pour la longueur variable des codages de caractères comme de l'UTF-8 et UTF-16.

Comment mettre en œuvre:

Jetez un oeil à la fonction iconv de la bibliothèque. iconv est un personnage puissant de conversion de la bibliothèque utilisée par des projets tels que libxml (XML C analyseur de Gnome)

D'autres excellentes ressources sur le codage des caractères:

12voto

mmalc Points 7663

Reçu la sagesse suggère que Spolsky l'article manque un couple de points importants.

Cet article est recommandée car elle est plus complète: L'Unicode® Standard: Une Introduction Technique

Cet article est aussi une bonne introduction: Unicode Bases

Ce dernier, en particulier, donne un aperçu de l'encodage des caractères les formes et les plans pour l'Unicode.

4voto

John Nilsson Points 4650

Les différents UTF normes sont des moyens pour coder le code de "points". Un codepoint est l'index de l'Unicode personnage jeu.

Un autre encodage est UCS2 qui est toujours 16 bits, et donc ne prend pas en charge la gamme Unicode.

Bon à savoir également que l'on codepoint n'est pas égal à un caractère. Par exemple un personnage comme å peut être représenté à la fois comme un point de code ou de deux points de code une pour l'une et l'autre pour l'anneau.

La comparaison de deux chaînes unicode requiert donc de la normalisation pour obtenir la représentation canonique avant la comparaison.

1voto

John Nilsson Points 4650

Il y a aussi le problème avec les polices. Il y a deux façons de gérer les polices. Soit vous utilisez un gigantesque police de caractères pour tous les caractères Unicode dont vous avez besoin (je pense que les versions récentes de Windows est livré avec un ou deux de ces polices). Ou vous utilisez som bibliothèque capable de combiner les glyphes de diverses polices dédiées à des sous-ensembles de la norme Unicode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X