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) ;
** {{en}} RFC 2279 - ''UTF-8, a transformation format of ISO 10646'', janvier 1998 (ancienne révision, obsolète) ;
** {{en}} RFC 2044 - ''UTF-8, a transformation format of Unicode and ISO 10646'', octobre 1996 (version initiale approuvée par l’ISO, obsolète) ;
** {{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]]