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).
Réponses
Trop de publicités?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
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.
Utilise 2 octets 4 octets pour chaque symbole.
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:
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.
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.
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.