12
votes

Guide du mannequin pour Unicode

Quelqu'un pourrait-il me donner une définition concise de

  • Unicode
  • utf7
  • UTF8
  • UTF16
  • UTF32
  • CodesPages
  • Comment ils diffèrent de ASCII / ANSI / Windows 1252

    Je ne suis pas après des liens Wikipedia ni des détails incroyables, quelques informations brèves sur la manière dont et pourquoi les énormes variations de Unicode sont venues et pourquoi vous devriez vous soucier de programmeur.


0 commentaires

6 Réponses :


20
votes

8 commentaires

La seule mise en garde est que certaines des informations sont obsolètes (Unicode étant une cible en mouvement), bien que rien que le questionneur n'a vraiment besoin de s'occuper de son niveau d'intérêt


En fait, l'article souvent référé de Joe n'était pas correct même à la date à laquelle il a été publié (2003). Correct UTF-8 ne va pas jusqu'à 6 octets (seulement 4), il existe une chose comme "un texte brut" (n'a rien à voir avec le codage), UCS n'est pas unicode lingo (is iso lingo), wchar_t et l "Bonjour" n'est pas nécessairement unicode. Mais bon, il sait plus que d'autres, même si certains d'entre eux sont faux. Le message est toujours le bon :-)


@Mihai: ① utf-8 peut aller jusqu'à 6 octets par caractère, mais seulement jusqu'à 4 sont nécessaires. La table de Joel est assez claire à ce sujet. ② Quelle chose est "texte clair"? Un texte ASCII clair? ③ Aucune objection à propos de UCS et de lingo Source ④ (Nitpicking :) wchar_t et l "bonjour" sont toujours Unicode, évidemment codé. Bien sûr, même "Mihai nita" est unicode, codé comme ascii ou iso8859-1 ou cp1252 ou même CP1253 ou ...


@tzot "utf-8 peut aller jusqu'à 6 octets par caractère": un tel codage n'est pas conforme à l'UTF-8 tel que défini, et c'est le cas puisque Unicode 3 ( Unicode.org/faq/utf_bom.html#utf8-4 ).


@tzot "wchar_t et l" bonjour "sont toujours unicode": pas selon les normes C / C ++. "La largeur de wchar_t est spécifique au compilateur et peut être aussi petite que 8 bits. Par conséquent, des programmes qui doivent être portables dans n'importe quel compilateur C ou C ++ ne doivent pas utiliser wchar_t pour stocker le texte Unicode. Le type wchar_t est destiné à stocker le compilateur caractères éloignés définis, qui peuvent être des caractères unicode dans certains compilateurs. " en.wikipedia.org/wiki/wide_character#c.2fc.2b. 2B


@tzot "Même" Mihai Nita "est unicode, codé comme ASCII ou ISO8859-1 ou CP1252 ou même CP1253". Incorrect. Quand quelque chose est codé car cp1252 n'est plus unicode. Tout caractère peut être représenté comme unicode, certains peuvent être représentés comme CP1252. Unicode et CP1252 sont à la fois des moyens d'attribuer des nombres aux caractères. Pourrait se chevaucher ou non (par exemple, le signe de l'euro est en 80h dans CP1252 mais U + 20AC dans Unicode). C'est un peu comme le numéro 12 représenté dans diverses bases: 0x0c hexagonal, 12 décembre, 014 octal. 12 est un nombre et c'est une abstraction. Vous ne pouvez pas dire que 12 est décimal, codé comme hexagonal ou octal.


@Mihainita "Tout personnage peut être représenté comme unicode" Non, aucun caractère n'est inclus dans une version d'UNICODE et par la suite, ou ce n'est pas le cas. Vous parlez comme si vous croyez que Unicode signifie le codage UCS-2, tout comme Microsoft implique dans ses systèmes d'exploitation. Oui, "les deux unicode et CP1252 sont des moyens d'attribuer des numéros aux caractères", mais seulement CP1252 est un moyen de coder de caractères à des octets. Unicode et UCS-4 / UTF-32 sont pas la même chose.


utf8Everywhere.org est une grande suite de l'article de Joel, sur ce que vous devriez vraiment faire dans votre application.




6
votes

Ainsi que le joel référencé OFT, j'ai mon propre article qui l'examine à partir d'un point de vue .NET-Centric, juste pour la variété ...


0 commentaires

3
votes

Oui, j'ai eu une idée, mais cela pourrait être faux, mais cela m'a aidé à le comprendre.

prenons simplement du texte. Il est stocké dans la RAM des ordinateurs en tant que série d'octets, le codépage est simplement la table de cartographie entre les octets et les personnages que vous avez lu. Donc, quelque chose comme le bloc-notes vient avec son codépage et traduit les octets vers votre écran et vous voyez un tas de déchets, des marques d'interrogation à l'envers, etc. Cela ne signifie pas que vos données sont gonflées que l'application qui lise les octets n'utilise pas le bon Codépage. Certaines applications sont plus intelligentes à la détection du code de code correct à utiliser que d'autres et certains flux d'octets en mémoire contiennent un bom qui représente une marque d'ordre d'octets, ce qui peut déclarer le code de code correct à utiliser.

utf7, 8 16 etc. ne sont que des points de code différents selon des formats différents.

Le même fichier stocké sous forme d'octets en utilisant différents codes de code sera différent, car les octets sont stockés différemment.

Ils ne diffèrent pas vraiment de Windows 1252 car c'est juste un autre codePage.

Pour une meilleure réponse plus intelligente, essayez l'un des liens.


0 commentaires

2
votes

D'autres ont déjà signalé des références assez bonnes pour commencer. Je ne suis pas la liste guide d'un vrai mannequin, mais plutôt des pointeurs de la page Consortium Unicode. Vous trouverez quelques raisons de plus-Nitty Gritty pour l'utilisation de différents encodages aux pages du Consortium Unicode.

Le Unicode FAQ est assez de bon endroit pour répondre à certains (pas tous) de vos requêtes .

Une réponse plus succincte pourquoi existe Unicode, est présent dans la section de nouveaux arrivants du site Unicode lui-même:

Unicode fournit un numéro unique pour chaque caractère, peu importe ce que le plate-forme, peu importe ce que le programme, quelle que soit la langue.

En ce qui concerne les raisons techniques pour l'utilisation de UTF-8, UTF-16 ou UTF-32 sont concernés, les mensonges de réponse dans la introduction technique Unicode :

UTF-8 est populaire pour HTML et similaire protocoles. UTF-8 est un mode de transformer tous les caractères Unicode dans une longueur variable de codage octets. Il présente les avantages que la caractères Unicode correspondant à le jeu ASCII familier ont le même les valeurs d'octets en tant que ASCII et que Unicode caractères transformés en UTF-8 peut être utilisé avec beaucoup de logiciels existants sans réécritures de logiciel complet.

UTF-16 est très populaire dans de nombreux environnements qui ont besoin d'un équilibre entre un accès efficace à des personnages avec une utilisation économique de espace de rangement. Il est assez compact et tous les personnages fortement utilisés correspondent en une seule unité de code de 16 bits, tandis que tous les autres personnages sont accessibles par l'intermédiaire de paires d'unités de code de 16 bits.

UTF-32 est très populaire où l'espace mémoire est sans souci, mais une largeur fixe, unique l'unité de code d'accès à des caractères est voulu. Chaque caractère Unicode est codées dans une seule unité de code 32 bits lors de l'utilisation UTF-32.

Les trois formes codant doivent au plus 4 octets (ou 32 bits) de données pour chaque caractère.

Une règle empirique générale est d'utiliser UTF-8 lorsque les principales langues supportées par votre application sont parlées à l'ouest de la rivière Indus, UTF-16 pour l'opposé (à l'est de l'Indus) et UTF-32 lorsque vous concerne environ en utilisant des caractères avec le stockage uniforme.

Par ailleurs UTF-7 est pas une norme Unicode et a été conçu principalement pour une utilisation dans les applications de messagerie.


2 commentaires

Notez que si le texte de votre application est stocké avec marquage (HTML, XML ou autre similaire), l'UTF-8 est souvent plus efficace, même pour les langues asiatiques. Par exemple, lors de la gestion du Web, choisissez d'utiliser UTF-8 uniformément tout au long de votre flux de travail est totalement raisonnable.


Oui, je suis d'accord avec cette notion pour traiter avec le Web. Cependant, pour les clients épais programmés en C / C ++, etc. UTF-16 est généralement logique pour un marché des langues asiatiques.



12
votes

Si vous voulez un vraiment brève introduction: Unicode en 5 minutes

ou si vous êtes après des doublures:

  • unicode: une cartographie de caractères vers des entiers ("points de code") dans la plage 0 à 1 114 1111; Couvre à peu près toutes les langues écrites utilisées
  • utf7: Un codage des points de code dans un flux d'octets avec le bit fort clair; En général n'utilisez pas
  • utf8: Un codage des points de code dans un flux d'octets dans lequel chaque caractère peut prendre un, deux, trois ou quatre octets à représenter; devrait être votre choix principal de codage
  • utf16: un codage des points de code dans un flux de mots (unités 16 bits) où chaque caractère peut prendre un ou deux mots (deux ou quatre octets) pour représenter
  • utf32: Un codage des points de code dans un flux d'unités de 32 bits où chaque caractère prend exactement une unité (quatre octets); Parfois utilisé pour la représentation interne
  • codes de code: Système dans DOS et Windows dans lequel les caractères sont attribués aux entiers et à un encodage associé; Chacun ne couvre qu'un sous-ensemble de langues. Notez que ces affectations sont généralement différents que les assignations Unicode
  • ASCII: une affectation très courante de caractères aux entiers et le codage direct dans les octets (tous fortement clairs); L'affectation est un sous-ensemble d'Unicode et le codage d'un sous-ensemble de UTF-8
  • ANSI: un organisme de normes
  • Windows 1252: CodePage couramment utilisé; Il est similaire à ISO-8859-1 ou latin-1, mais pas le même, et les deux sont souvent confus

    Pourquoi vous souciez-vous? Parce que sans connaître le jeu de caractères et le codage utilisé, vous ne savez pas vraiment quels caractères un flux d'octets donné représente. Par exemple, l'octet 0xde pourrait coder

    • þ (lettre majuscule latine Thorn)
    • FI (FI LATINE petite LIGATURE)
    • ή (petite lettre grecque ETA avec Tonos)
    • ou 13 autres caractères, en fonction du codage et du jeu de caractères utilisé.

0 commentaires