UTF-8 3108 30231938 2008-06-02T07:16:09Z 82.67.73.121 orthographe {{Table Unicode}} '''UTF-8''' (''UCS transformation format'' 8 [[bit (informatique)|bit]]s) est un [[format de données|format]] de [[codage de caractères]] défini pour les [[caractère (informatique)|caractère]]s [[Unicode]] (UCS). Chaque caractère est codé sur une suite d'un à quatre [[octet]]s. UTF-8 a été conçu pour être compatible avec certains logiciels originellement prévus pour traiter des caractères d'un seul octet. UTF-8 est [[standard industriel|standardisé]] dans la RFC 3629 (''UTF-8, a transformation format of ISO 10646''). Le codage était aussi défini dans le rapport technique 17 de la [[norme]] [[Unicode]]. Il fait maintenant partie intégrante de la norme dans son chapitre 3 ''Conformance'' et est également approuvé par l’[[Organisation internationale de normalisation]] (ISO), l’[[Internet Engineering Task Force]] (IETF) et la plupart des organismes de normalisation nationaux. L’IETF requiert qu’UTF-8 soit pris en charge par les [[protocole de communication|protocoles de communication]] d’[[Internet]] échangeant du texte. == Description == Le numéro de chaque caractère est donné par le [[standard industriel|standard]] [[Unicode]]. Les caractères de numéro 0 à 127 sont codés sur un [[octet]] dont le [[bit (informatique)|bit]] de poids fort est toujours nul. Les caractères de numéro supérieur à 127 sont codés sur plusieurs octets. Dans ce cas, les bits de poids fort du premier octet forment une suite de 1 de longueur égale au nombre d'octets utilisés pour coder le caractère, les octets suivants ayant <tt>10</tt> comme bits de poids fort. {| class=wikitable |+ '''Définition du nombre d'octets utilisés''' ! Représentation binaire UTF-8 ! Signification |- align=left | <tt>'''0'''xxxxxxx</tt> | 1 octet codant 1 à 7 bits |- align=left {{ligne grise}} | <tt>'''110'''xxxxx '''10'''xxxxxx</tt> | 2 octets codant 8 à 11 bits |- align=left | <tt>'''1110'''xxxx '''10'''xxxxxx '''10'''xxxxxx</tt> | 3 octets codant 12 à 16 bits |- align=left {{ligne grise}} | <tt>'''11110'''xxx '''10'''xxxxxx '''10'''xxxxxx '''10'''xxxxxx</tt> | 4 octets codant 17 à 21 bits |} Ce principe pourrait être étendu jusqu'à huit octets pour un caractère, mais UTF-8 pose la limite à quatre. Ce principe permet également d'utiliser plus d'octets que nécessaire pour coder un caractère, mais UTF-8 l'interdit. {| class=wikitable |+ '''Exemples de codage UTF-8''' ! Caractère ! Numéro du caractère ! Codage binaire UTF-8 |- align=left | A | 65 | <tt>'''0'''1000001</tt> |- align=left {{ligne grise}} | é | 233 | <tt>'''110'''00011 '''10'''101001</tt> |- align=left | € | 8364 | <tt>'''1110'''0010 '''10'''000010 '''10'''101100</tt> |- align=left {{ligne grise}} |𝄞 | 119070 | <tt>'''11110'''000 '''10'''011101 '''10'''000100 '''10'''011110</tt> |} Dans toute [[chaîne de caractères]] UTF-8, on remarque que : * tout octet de bit de poids fort nul code un caractère US-[[ASCII]] sur un octet ; * tout octet de bits de poids fort valant <tt>11</tt> est le premier octet d'un caractère codé sur plusieurs octets ; * tout octet de bits de poids fort valant <tt>10</tt> est à l'intérieur d'un caractère codé sur plusieurs octets. == Avantages == ;Universalité : Ce codage permet de représenter les milliers de caractères d'[[Unicode]]. ; Compatibilité avec US-[[ASCII]] : Un texte en US-ASCII est codé identiquement en UTF-8. ;[[Interopérabilité informatique|Interopérabilité]] : Du fait qu'un caractère est découpé en une suite d'octets (et non en mots de plusieurs octets), il n'y a pas de problème d'[[endianness]]. Problème qui apparaît avec les codages [[UTF-16]] et [[UTF-32]] par exemple. ; Efficacité : Pour les langues utilisant beaucoup les caractères US-[[ASCII]], UTF-8 nécessite moins d'octets que l'[[UTF-16]] ou l'[[UTF-32]]. ; Réutilisabilité : De nombreuses techniques de [[programmation informatique]] valables avec les caractères uniformément codés sur un octet le restent avec UTF-8, notamment : :* la manière de repérer la fin d'une [[chaîne de caractères]] [[C (langage)|C]], car l'octet 00000000 dans une chaîne de caractères codés en UTF-8 est toujours le [[caractère nul]]. :* la manière de trouver une sous-chaîne est identique. ; Fiabilité : Il s'agit d'un codage auto-synchronisant (en lisant un seul octet on sait si c'est le premier d'un caractère ou non). :* Une séquence décrivant un caractère n'apparaît jamais dans une séquence plus longue décrivant un autre caractère (cas de [[Shift-JIS]]). :* Il n'existe pas de code « d'échappement » changeant l'interprétation de la suite d'une séquence d'octets. == Inconvénients == ; Taille variable : Les caractères sont représentés en UTF-8 par des séquences d'octets de taille variable, ce qui rend certaines opérations sur les chaînes de caractères plus compliquées : le calcul du nombre de caractères ; le positionnement à une distance donnée dans un fichier texte et en règle générale toute opération nécessitant l'accès au caractère de position N dans une chaîne. ; Efficacité : Pour les langues utilisant beaucoup de caractères extérieurs à [[American Standard Code for Information Interchange|US-ASCII]], UTF-8 occupe sensiblement plus d'espace. Par exemple, les idéogrammes courants employés dans les textes de langues asiatiques comme le [[Langue chinoise|chinois]], le [[coréen]] ou le [[japonais]] ([[kanji]], par exemple) utilisent 3 octets en UTF-8 contre 2 octets en UTF-16. De manière générale, les scripts employant beaucoup de caractères de valeur supérieure à U+0800 occupent plus de mémoire que s'ils étaient codés avec UTF-16. ; Séquences invalides : De par son système de codage, il est possible de représenter un point de code de différentes manières en UTF-8, ce qui peut poser un problème de sécurité : un programme mal écrit peut accepter un certain nombre de représentations UTF-8, normalement invalides selon la RFC 3629 mais pas selon la spécification originale, et les convertir comme un seul et même caractère. De fait, un [[logiciel]] détectant certaines chaînes de caractères (pour prévenir les [[Injection SQL|injections SQL]], par exemple) peut échouer dans sa tâche. :Prenons un exemple tiré d'un cas réel de virus attaquant des [[serveur HTTP|serveurs HTTP]] du [[World Wide Web|Web]] en [[2001]] ({{en}}[http://www.schneier.com/crypto-gram-0007.html#9] [http://www.securityfocus.com/bid/1806/] [http://attrition.org/security/advisory/advisory/nsfocus/sa2000-06.iis_unicode]). Une séquence à détecter pourrait être « /../ » représentée en ASCII (''a fortiori'' en UTF-8) par les octets « <code>2F 2E 2E 2F</code> » en notation [[système hexadécimal|hexadécimale]]. :Cependant, une manière malformée de coder cette chaîne en UTF-8 serait « <code>2F '''C0 AE''' 2E 2F</code> », appelée aussi en anglais ''overlong form (forme superlongue)''. Si le logiciel n'est pas soigneusement écrit pour rejeter cette chaîne, en la mettant par exemple sous forme [[Canonique (informatique)|canonique]], une brèche potentielle de sécurité est ouverte. Cette attaque est appelée ''directory traversal''. == Histoire == UTF-8 a été inventé par [[Kenneth Thompson]] lors d'un dîner avec [[Rob Pike]] aux alentours de [[septembre 1992]]. Il a été immédiatement utilisé dans le [[système d'exploitation]] [[Plan 9 from Bell Labs|Plan 9]] sur lequel ils travaillaient. Une contrainte à résoudre était de coder les caractères nul et '/' comme en [[ASCII]] et qu'aucun octet codant un autre caractère n'ait le même code. Ainsi les systèmes d'exploitation [[UNIX]] pouvaient continuer à rechercher ces deux caractères dans une chaîne sans adaptation logicielle. === Prise en charge === * [[Navigateur web|Navigateurs web]] : la prise en charge d'UTF-8 commença à être répandue à partir de [[1998]]. ** Les anciens [[Navigateur web|navigateurs web]] ne supportant pas UTF-8 affichent tout de même correctement les 127 premiers caractères [[American Standard Code for Information Interchange|ASCII]]. ** Le navigateur [[Netscape Navigator]] supporte UTF-8 à partir de sa version 4 ([[juin 1997]]). ** Le navigateur [[Internet Explorer|Microsoft Internet Explorer]] supporte UTF-8 à partir de sa version 4 ([[octobre 1997]]) pour [[Microsoft Windows]] et pour [[Mac OS]] ([[janvier 1998]]). ** Les navigateurs basés sur le [[Gecko (moteur de rendu)|moteur de rendu Gecko]] (lancé en [[1998]]) supportent l'UTF-8 : [[Mozilla]], [[Mozilla Firefox]], [[SeaMonkey]] etc. ** Le navigateur [[Opera (logiciel)|Opera]] supporte UTF-8 à partir de sa version 6 ([[novembre 2001]]). ** Le navigateur [[Konqueror]] supporte UTF-8. ** Le navigateur [[Safari]] sur Macintosh et Windows supporte UTF-8. ** Le navigateur [[OmniWeb]] sur Macintosh supporte UTF-8. * Fichiers et noms de fichiers : de plus en plus courant sous les systèmes GNU/Linux, pas très bien supporté sous Windows. * [[Client de messagerie]] ** [[Mozilla Thunderbird|Thunderbird]] supporte UTF-8 ** [[Si.Mail]] supporte UTF-8 ** certains [[webmail]]s, comme Horde/IMP ne sont pas compatibles avec ce standard. ==Voir aussi== * [[UTF-16]], [[UTF-32]], [[CESU-8]] * [[Unicode]], [[ISO/CEI 10646]] * [[ISO 646]], [[ASCII]] * [[ISO 8859]], [[ISO 8859-1]] * [[Analyse syntaxique]] {{Table des caractères Unicode/Liens non-caractère}} == Liens externes == * {{fr}} [http://hapax.qc.ca/conversion.fr.html Formulaire de conversion UTF-8, UTF-16, UTF-32] * {{fr}} [http://hapax.qc.ca/pdf/Chapitre-3.pdf ''Conformité''] - Traduction du Standard Unicode en français {{pdf}} * {{en}} [http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf ''Conformance''] - ''The Unicode Standard 4.0'', chapitre 3.2 pp. 60-61 et chapitre 3.4 pp. 64-65 et chapitre 3.9 pp. 73-81, août 2003, ISBN 0-321-18578-1 {{pdf}} * {{en}} RFC 3629 - ''UTF-8, a transformation format of ISO 10646'', [[novembre 2003]] (standard, totalement compatible avec Unicode)&nbsp;; ** {{en}} RFC 2279 - ''UTF-8, a transformation format of ISO 10646'', janvier 1998 (ancienne révision, obsolète)&nbsp;; ** {{en}} RFC 2044 - ''UTF-8, a transformation format of Unicode and ISO 10646'', octobre 1996 (version initiale approuvée par l’ISO, obsolète)&nbsp;; ** {{en}} [http://www.cs.bell-labs.com/sys/doc/utf.pdf Papier original sur UTF-8] - de [[Rob Pike]] et [[Ken Thompson]] (informatif, obsolète) {{pdf}}. * {{en}} RFC 2277 - ''IETF policy on character sets and languages'', janvier 1998 * {{en}} [http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt Histoire de la création d'UTF-8] - par [[Rob Pike]] {{Portail|Informatique|Écriture}} [[Catégorie:Unicode]] [[Catégorie:Internationalisation en informatique]] [[ar:صيغة التحويل الموحد-8]] [[cs:UTF-8]] [[da:UTF-8]] [[de:UTF-8]] [[el:UTF-8]] [[en:UTF-8]] [[eo:UTF-8]] [[es:UTF-8]] [[fi:Unicode#UTF-8]] [[he:UTF-8]] [[hr:UTF-8]] [[hu:UTF-8]] [[it:UTF-8]] [[ja:UTF-8]] [[ko:UTF-8]] [[lt:UTF-8]] [[lv:UTF-8]] [[nl:UTF-8]] [[nn:UTF-8]] [[no:UTF-8]] [[pl:UTF-8]] [[pt:UTF-8]] [[ru:UTF-8]] [[sk:UTF-8]] [[sl:UTF-8]] [[sv:UTF-8]] [[tr:UTF-8]] [[uk:UTF-8]] [[zh:UTF-8]]