UTF-8, un format de transformation pour Unicode et ISO 10646

 

Network Working Group

Request For Comments : 2044

Catégorie : Informatif

 

Auteur : F. Yergeau – Alis Technologies – Octobre 1996

Traducteur : N. Schaefer – sN Traduction – Août 2005

 

Statut de ce document

 

Ce document apporte des informations à la communauté Internet. En aucun cas, ce document ne spécifie pas un standard. La diffusion de ce document est libre.

 

Résumé

 

Les standards Unicode, version 1.1 et ISO/IEC 10646-1 :1993 définissent tout deux une table de caractères sur 16 bits qui convient à la plupart des systèmes d’écriture au monde. Les caractères codés sur 16 bits ne sont toutefois pas compatibles avec de nombreux protocoles et applications. Cette situation a conduit au développement de plusieurs formats de transformation UCS (UCS Transformation Format, UTF), chacun possédant ses propres caractéristiques. UTF-8 a la caractéristique de préserver la table ASCII américaine : les caractères ASCII américains sont codés sur un octet en utilisant la valeur ASCII traditionnelle, et chaque octet qui possède une telle valeur ne peut être qu’un caractère ASCII américain. Cela apporte une compatibilité entre les systèmes de fichiers, les analyseurs et les autres applications qui se basent sur les valeurs ASCII américaines mais qui ne considèrent pas les autres valeurs.

 

1. Introduction

 

Les standards Unicode, version 1.1 [UNICODE], et ISO/IEC 10646-1 :1993 [ISO-10646] définissent tout deux une table de caractères sur 16 bits, UCS-2, qui convient à la plupart des systèmes d’écriture du monde. L’ISO-10646 défini également une table de caractères sur 31 bits, UCS-4, qui n’assigne aucune valeur au-delà de la région couverte par UCS-2 (the Basic Multilingual Plane, BMP). Cependant, les codages UCS-2 et UCS-4 sont difficiles à utiliser dans de nombreuses applications et protocoles qui travaillent avec des caractères codés sur 8 ou même 7 bits. Même certains systèmes plus récents capables de travailler avec des caractères sur 16 bits ne peuvent pas traiter les données codées en UCS-4. Cette situation a conduit au développement de formats de transformation UCS (UCS Transformation Formats, UTF), chacun possédant ses propres caractéristiques.

 

UTF-1 a uniquement un intérêt historique, et a été retiré de l’ISO 10646. UTF-7 a l’avantage de coder l’ensemble de la table Unicode en utilisant uniquement des octets dont le bit de poids fort est supprimé (valeurs ASCII américaines codées sur 7 bits [US-ASCII]), ce qui assure un codage sûr des emails ([RFC1642]). UTF-8 utilise tous les bits d’un octet mais a l’avantage de préserver le table ASCII américaine : les caractères ASCII américains sont codés sur un octet qui possède la valeur ASCII normale, et chaque octet de cette valeur peut uniquement être interprété comme un caractère ASCII et rien d’autre.

 

UFT-16 est une méthode permettant de transformer un sous-ensemble de la table UCS-4 en une paire de valeurs UCS-2 d’une plage réservée. UTF-16 impacte donc UTF-8 car les valeurs UCS-2 de la plage réservée doivent être traitées de manière particulière dans la transformation UTF-8.

 

UTF-8 code les caractères UCS-2 ou UCS-4 sur un nombre variable d’octets, où le nombre d’octets, et la valeur de chacun de ces octets, dépendent de la valeur entière assignée au caractère avec ISO 10646. Ce format de transformation possède les caractéristiques suivantes (toutes les valeurs sont en hexadécimal) :

·         Les caractères de valeurs allant de 0000 0000 à 0000 007F (valeurs ASCII américaines) correspondent aux octets 00 à 7F (valeurs ASCII américaines sur 7 bits).

·         Dans tous les autres cas, les valeurs ASCII américaines n’apparaissent pas dans un flux de caractères codés en UTF-8. Cela apporte une compatibilité entre les systèmes de fichiers ou les autres applications qui se basent sur les valeurs ASCII américaines mais qui ne considèrent pas les autres valeurs.

·         La conversion dans les deux sens entre UTF-8 et UCS-4, UCS-2 ou Unicode est facile.

·         Le premier octet d’une séquence d’octets indique le nombre d’octets dans la séquence.

·         Les délimitations des caractères sont facilement repérables dans un flux d’octets.

·         Le tri lexicographique des chaînes de caractères UCS-4 est conservé. Bien sûr, cela présente un intérêt limité dans la mesure où le tri n’est, dans aucun des deux cas, culturellement valide.

·         Les octets de valeurs FE et FF n’apparaissent jamais.

 

A l’origine, UTF-8 était un projet du XOJIG (X/Open Joint Internationalization Group) dont l’objectif était de réaliser un système de fichiers sécurisé basé sur UTF (File System Safe UCS Transformation Format, FSS-UTF) compatible avec les systèmes UNIX, et supportant les textes multilingues avec le même codage. Les premiers auteurs sont Gary Miller, Greger Leijonhufvud et John Entenmann. Plus tard, Ken Thompson et Rob Pike réalisèrent un travail significatif sur UTF-8.

 

Une description peut également être consultée dans le rapport technique Unicode #4 (Unicode Technical Report #4) [UNICODE]. La référence définitive, contenant les dispositions pour les données UTF-16 avec UTF-8, est l’annexe de l’ISO/IEC 10646-1 [ISO-10646].

 

2. Définition d’UTF-8

 

Avec UTF-8, les caractères sont codés en utilisant des séquences contenant jusqu’à 6 octets. L’octet d’une séquence composée d’un seul octet a son premier bit à 0, les 7 bits restants sont utilisés pour coder le caractère. Dans une séquence de n octets (n>1), les n premiers octets sont placés à 1 et suivis d’un bit à 0. Les bits restants contiennent une partie de la valeur du caractère à coder. Tous les octets suivants ont leur premier bit à 1 et le deuxième à 0, laissant les 6 derniers bits pour la valeur du caractère à coder.

 

Le tableau suivant résume le format des différents types d’octets. La lettre x indique les bits disponibles pour le codage des bits du caractère UCS-4.

 

Plages UCS-4

(hexadécimal)

octets UTF-8

(binaire)

0000 0000 – 0000 007F

0xxxxxxx

0000 0080 – 0000 07FF

110xxxxx 10xxxxxx

0000 0800 – 0000 FFFF

1110xxxx 10xxxxxx 10xxxxxx

0001 0000 – 001F FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0020 0000 – 03FF FFFF

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0400 0000 – 7FFF FFFF

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

 

Pour coder en UTF-8 à partir de caractères UCS-4, procédez de la manière suivante :

 

1) Déterminez le nombre d’octets nécessaires à partir de la valeur du caractère à coder et de la première colonne du tableau précédent.

 

2) Préparez les bits de poids fort à partir de la deuxième colonne du tableau.

 

3) Remplissez les bits x à partir des bits du caractère, en commençant par les bits de poids faible du caractère et en les mettant en premier dans les derniers octets de la séquence, et ainsi de suite jusqu’à ce que les bits x soient remplis.

 

L’algorithme pour coder en UTF-8 à partir de caractères UCS-2 (ou Unicode) peut être déduit de la méthode précédente, en étendant chaque caractère UCS-2 avec deux octets nuls. Cependant, les valeurs UCS-2 entre D800 et DFFF, qui sont actuellement des caractères UCS-4 transformés à l’aide d’UTF-16, nécessitent un traitement particulier : il faut annuler la transformation UTF-16 afin d’obtenir un caractère UCS-4 qui peut être transformé à l’aide de la méthode précédente.

 

Pour décoder de l’UTF-8 en UCS-4, procédez de la manière suivante :

 

1) Initialisez les 4 octets du caractère UCS-4 en plaçant tous les bits à 0.

 

2) Déterminez les bits qui codent la valeur du caractère à partir du nombre d’octets dans la séquence et la deuxième colonne du tableau (les bits x).

 

3) Placez les bits de la séquence dans le caractère UCS-4, en premier les bits de poids faible du dernier octet de la séquence et en avançant vers la gauche jusqu’à ce qu’il ne reste plus de bits x.

 

Si la séquence UTF-8 ne fait pas plus de 3 octets de long, le décodage peut fournir directement un caractère UCS-2 (ou l’équivalent en Unicode).

 

Un algorithme et une formule plus détaillés peuvent être consultés dans [FSS-UTF], [UNICODE] ou l’annexe R de [ISO-10646].

 

3. Exemples

 

La séquence Unicode « A<NOT IDENTICAL TO><ALPHA>. » (0041, 2262, 0391, 002E) sera codée : 41 E2 89 A2 CE 91 2E

 

La séquence Unicode « Hi Mom <WHITE SMILLING FACE>! » (0048, 0069, 0020, 004D, 006F, 006D, 0020, 263A, 0021) sera codée : 48 69 20 4D 6F 6D 20 E2 98 BA 21

 

La séquence Unicode représentant les caractères Han pour le mot japonais « nihongo » (65E5, 672C, 8A9E) sera codée : E6 97 A5 E6 9C AC E8 AA 9E

 

Enregistrements MIME

 

Ce document est fait pour servir de base pour l’enregistrement d’un codage de caractères MIME selon la RFC 1521 ([RFC1521]). La valeur du paramètre proposée est « UTF-8 ». Cette chaîne de caractères pourrait étiqueter les données contenant du texte composé de caractères issus du format ISO 10646-1 et codés en utilisant la méthode détaillée plus haut.

 

Considérations relatives à la sécurité

 

Ce document ne comporte aucune considération relative à la sécurité.

 

Remerciements

 

Les personnes suivantes ont participé à la rédaction et aux discussions concernant ce document :

 

James E. Agenbroad

Martin J. Dürst

Edwin F. Hart

Markus Kuhn

Alain LaBonte

Keld Simonsen

Andries Brouwer

David Goldsmith

Kent Karlsson

Michael Kung

Murray Sargent

Arnold Winkler

 

Bibliographie

 

[FSS-UTF]

X/Open CAE Specification C501 ISBN 1-85912-082-2 28cm. 22p. pbk. 172g. 4/95, X/Open Company Ltd., "File System Safe UCS Transformation Format (FSS_UTF)", X/Open Preleminary Specification, Document Number P316.  Also published in Unicode Technical Report #4.

[ISO-10646]

ISO/IEC 10646-1:1993. International Standard -- Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. UTF-8 is described in Annex R, adopted but not yet published.  UTF-16 is described in Annex Q, adopted but not yet published.

[RFC1521]

Borenstein, N., and N. Freed, "MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies", RFC 1521, Bellcore, Innosoft, September 1993.

[RFC1641]

Goldsmith, D., and M. Davis, "Using Unicode with MIME", RFC 1641, Taligent inc., July 1994.

[RFC1642]

Goldsmith, D., and M. Davis, "UTF-7: A Mail-safe Transformation Format of Unicode", RFC 1642, Taligent, Inc., July 1994.

[UNICODE]

The Unicode Consortium, "The Unicode Standard -- Worldwide Character Encoding -- Version 1.0", Addison-Wesley, Volume 1, 1991, Volume 2, 1992.  UTF-8 is described in Unicode Technical Report #4.

[US-ASCII]

Coded Character Set -- 7-bit American Standard Code for Information Interchange, ANSI X3.4-1986.

 

Coordonnées de l’auteur

 

Francois Yergeau

Alis Technologies

100, boul. Alexis-Nihon

Suite 600

Montreal  QC  H4M 2P2

Canada

 

Téléphone : +1 (514) 747-2547

Fax : +1 (514) 747-2561

Adresse email : fyergeau@alis.com

 

Coordonnées du traducteur

 

Nils Schaefer

sN Traduction (www.sntraduction.com)

16 rue George Sand

51420 Witry-lès-Reims

France

 

Téléphone : +33 (03) 26 04 58 65

Adresse email : traduction@sntraduction.com