2009-05-21 10 views
3

J'ai quelques problèmes pour comprendre les différences entre UTF-8, UTF-16, ASCII et ANSI. Après avoir fait quelques recherches, j'ai une idée, mais ce serait vraiment utile si quelqu'un pouvait expliquer exactement la différence entre eux (y compris la représentation en octets d'un personnage typique de chacun).Codage de caractères confusion!

Je quess ma question se résume à

1) How do each of the above store characters as bytes 
2) What are the differences between the above standards 
3) What is a code page 
4) Method of converting characters between the various types. 

Un grand merci :)

+0

Question connexe (la plupart des votes dans la balise unicode): http://stackoverflow.com/questions/222386 – mghie

Répondre

12

J'ai trouvé Joel's article sur Unicode pour expliquer très bien. Plus précisément, il couvre l'histoire (essentielle pour ce sujet), les encodages (UTF-8/16 etc.) et les pages de codes.

0

Le traitement de l'information O'Reilly CJKV contient beaucoup d'arrière-plan sur les jeux de caractères et codages de caractères: avec une attention particulière sur les données de CJKV, bien sûr. J'ai trouvé utile de comprendre au-delà de "comment puis-je obtenir un symbole! *! ** # @ pour s'afficher correctement?".

0

Sur Unix, utilisez le programme nommé recode ou iconv pour convertir des fichiers texte à un autre encodage, ou utiliser la fonction iconv (man 3 iconv) dans votre programme C ou C++.

Si vous utilisez Perl, utilisez le module Encode pour la conversion (par exemple use Encode; print encode("utf-8", "\xabfoo")). Si vous utilisez Python, utilisez unicode.encode et/ou str.decode (par exemple print u'\xabfoo'.encode('utf-8')).

4

Pour tenter rapidement de répondre à vos questions spécifiques.

1: Une certaine combinaison de bits représente un certain caractère. Un seul caractère peut être stocké dans plusieurs octets.

2: Brèves informations et différences entre les codages que vous avez mentionnés.

ASCII
Comprend les définitions de 128 caractères.

ANSI
a plus de caractères que l'ASCII, mais se glisse dans un octet. Nécessite une page de code.

UTF-8
Cela peut être utilisé pour représenter un caractère Unicode. Il y a beaucoup plus de caractères Unicode que de caractères ASCII. Il stocke chaque caractère dans un à quatre octets de données.

UTF-16
similaires à UTF-8, mais l'unité de base est de 16 bits. Si vous n'utilisez que l'anglais, vous gaspillez 8 bits sur chaque personnage.

3: Une page de code est ce qui spécifie à l'ordinateur quelle (combinaison de bits) fait référence à quel caractère. Unicode n'a pas besoin de pages de code car chaque personnage a sa propre combinaison de bits. ANSI a des pages de codes car il ne dispose que de 256 caractères disponibles.Par exemple, si vous étiez sur un ordinateur arabe, l'arabe serait défini comme page de code et les caractères arabes pourraient être affichés.

4: La méthode de la conversion dépend du jeu de caractères que vous convertissez et de et les pages de code utilisées (le cas échéant). Certaines conversions peuvent ne pas être possibles. UTF-8 est rétrocompatible avec ASCII, ce qui signifie que si votre texte ne comprend que les 128 premiers caractères US, il est exactement le même que le même texte en codage ASCII.

Cette réponse est ad hoc et il peut y avoir des erreurs, des corrections bienvenues.

0

Un couple de points aléatoires qui sont utiles à savoir:

  • Une chose intéressante à propos UTF-8 et ASCII est que les 127 ASCII caractères sont codés exactement de la même manière UTF- 8 (cela peut également être le cas avec d'autres schémas UTF, je suis pas sûr) En d'autres termes, dans la gamme ASCII ou caractères, ASCII et UTF-8 sont totalement interchangeables.

    La façon dont cela est ce qui est à peu près UTF-8 est de longueur variable; le "premier" 127 caractères sont représentés par un octet simple chacun. Au-delà de cela, commence à utiliser plusieurs octets. Comment un décodeur savoir si d'interpréter un octet comme un seul caractère ASCII ou dans le cadre d'une séquence multi-octets? Parce que les bits au début de l'octet suivent certains modèles: un zéro bit au début signifie qu'il est un caractère unique octet et n 1 bits signifie cet octet est le début de un n séquence d'octets.

  • En outre, différentes langues seront convertir leurs chaînes natives en différents encodages lorsque vous sortie eux, par exemple, les imprimer dans un fichier ou sur l'écran. Par conséquent, si vous êtes intéressé par interchangeabilité entre les langues et les plates-formes, vous devez toujours spécifier comment vous souhaitez que les types de chaînes de votre langue soient affichés. Sinon, vous obtiendrez des erreurs étranges et inattendues!

  • UTF-8 est également la norme XML.