U
NICODE
3.1
ANNOTĂ
161
Chapitre 6
Formes de normalisation
6.1
Introduction
Le standard Unicode dĂ©finit deux formes dâĂ©quivalences entre caractĂšres : lâĂ©quivalence
canonique et lâĂ©quivalence de compatibilitĂ©. LâĂ©quivalence canonique Ă©tablit une relation
dâĂ©galitĂ© fondamentale entre caractĂšres ou suites de caractĂšres. La Figure 6-1b dĂ©crit cette
Ă©quivalence :
Figure 6-1. Ăquivalence canonique
âą
Ăquivalence fondamentale
âą
Indifférenciable aux yeux de
lâutilisateur, si rendu correctement
âą
Comprend :
âŠ
hangûl
âŠ
suite de diacritiques
âŠ
singleton
1
Figure 6-1b. Exemples dâĂ©quivalence
Afin de garantir une compatibilité aller-retour entre les normes préexistantes et Unicode,
plusieurs codes dâUnicode reprĂ©sentent des entitĂ©s qui ne sont que des variantes dâun mĂȘme
caractÚre générique. Les représentations visuelles qui illustrent ce caractÚre générique forment
dâordinaire un sous-ensemble de toutes ses reprĂ©sentations visuelles possibles. Unicode dĂ©finit
pour ces caractĂšres des dĂ©compositions de compatibilitĂ©. Lâapparence de ces caractĂšres Ă©tant
quelque peu différente ; les remplacer par un seul caractÚre entraßnerait une perte potentielle
dâinformation de formatage, Ă moins dâajouter du balisage complĂ©mentaire. La Figure 6-2 fournit
quelques exemples dâĂ©quivalences de compatibilitĂ©.
1
CaractÚres précomposés dont la décomposition consiste en un seul caractÚre et non une suite de caractÚres comme
câest le plus souvent le cas.
ž
&
©
6.1 I
NTRODUCTION
F
ORMES DE
N
ORMALISATION
162
U
NICODE
3.1
ANNOTĂ
Les chapitres 2 et 3 exposent de maniĂšre plus dĂ©taillĂ©e ces deux types dâĂ©quivalence. En outre,
la section 5.7, Normalisation, décrit également plusieurs formes de normalisation. Unicode
définit ces formes de normalisation afin de pouvoir produire à partir de toute chaßne une seule
forme normalisée. La section 3.6, Décomposition, définit de maniÚre précise deux de ces
formes. Elle dĂ©finit notamment la dĂ©composition canonique qui peut ĂȘtre utilisĂ©e dans lâĂ©change
normalisĂ© de textes. Cette forme permet dâeffectuer une comparaison binaire tout en conservant
une Ă©quivalence canonique avec le texte non normalisĂ© dâorigine.
Figure 6-2. Ăquivalences de compatibilitĂ©
âą
Différences de formatage
âŠ
Variante de fonte (
)
âŠ
Différence de sécabilité ( - )
âŠ
Forme cursive (
)
âŠ
Cerclé (
âŠ
Chasse, force, rotation (
Ë
)
âŠ
Exposant, indice (
9
9
)
âŠ
Disposé en carré (
)
âŠ
Fraction ( Ÿ )
âŠ
Autres (
)
La section 3.6 dĂ©finit Ă©galement la dĂ©composition de compatibilitĂ©. Celle-ci permet dâeffectuer
une comparaison binaire tout en conservant cette-fois-ci une équivalence de compatibilité avec
le texte non normalisĂ© dâorigine. Cette derniĂšre forme peut sâavĂ©rer utile en maintes occasions
puisquâelle permet dâĂ©liminer des diffĂ©rences qui ne sont pas toujours pertinentes. Les
caractĂšres katakana Ă pleine chasse et Ă demi-chasse ont les mĂȘmes dĂ©compositions de
compatibilité et sont donc compatibles ; ils ne sont toutefois pas canoniquement équivalents.
Ces deux formes normalisent vers des caractÚres décomposés. Bien que la section 3.6,
DĂ©composition, mentionne
Ă©galement lâexistence dâune normalisation vers des caractĂšres
composites
2
, elle nâen prĂ©cise pas la forme. La nature des formes prĂ©composĂ©es dans le
standard Unicode permet dâenvisager plusieurs normalisations Ă base de caractĂšres
composites. Ce chapitre donne une définition unique de la normalisation et identifie chacune
des formes normalisées.
Le Tableau 6-1 désigne les quatre formes de normalisation. Tout comme pour la décomposition,
il existe deux formes normalisées vers les caractÚres précomposés : C et KC. Le résultat de
lâune est lâĂ©quivalent canonique du texte non normalisĂ© dâorigine, le rĂ©sultat de lâautre est
équivalent de compatibilité. Le K de KD et KC représente le mot compatibilité (suggéré par
lâallemand kompatibel) alors que le C signifie canonique. Les deux types de normalisation
peuvent sâavĂ©rer utiles. Le D lui se rĂ©fĂšre Ă la dĂ©composition.
2
Ăgalement connus sous le nom de caractĂšres prĂ©composĂ©s ou dĂ©composables.
k
g
f
i
F
ORMES DE
N
ORMALISATION
6.1 I
NTRODUCTION
U
NICODE
3.1
ANNOTĂ
163
Tableau 6-1. Quatre formes de normalisation
Nom
Description
DĂ©finition
Forme de
normalisation D
(FND)
DĂ©composition canonique
Sections 3.6, DĂ©composition, 3.10, Mise en
ordre canonique, et 3.11, Comportement des
jamos jointifs.
Forme de
normalisation C
(FNC)
DĂ©composition canonique
suivie dâune composition
canonique
Section 6.5, DĂ©finition.
Forme de
normalisation KD
(FNKD)
DĂ©composition de
compatibilité
Sections 3.6, DĂ©composition, 3.10, Mise en
ordre canonique, et 3.11, Comportement des
jamos jointifs.
Forme de
normalisation KC
(FNKC)
DĂ©composition de
comptabilitĂ© suivie dâune
composition canonique
Section 6.5, DĂ©finition.
Figure 6-3. Application des quatre formes de normalisation
ro
le
ro
le,
A
rhus, 35A
,
ne, 2
5
, fine
LĂ©gende
Ă Ă©viter
_
Compatibilité
_
Précomposé
ĂŽ
Combinatoire
ro
le
rĂŽle,
A
rhus, 35Ă ,
ne, 2
5
, fine
rĂŽle
rĂŽle,
Ă rhus, 35Ă ,
ne, 2
5
, fine
ro
le
ro
le,
A
rhus, 35A
,
fine, 25, fine
rĂŽle
rĂŽle,
Ă rhus, 35Ă ,
fine, 25, fine
D
C
KD
KC
6.1 I
NTRODUCTION
F
ORMES DE
N
ORMALISATION
164
U
NICODE
3.1
ANNOTĂ
La Figure 6-3 ci-dessus illustre lâeffet de lâapplication de diffĂ©rentes formes de normalisation sur
un texte non normalisé. Le tableau illustre les transformations qui affectent différents types de
caractĂšre.
Quelle que soit la forme de normalisation, on remplace les caractĂšres singletons (ceux qui
possĂšdent une transformation canonique vers un seul caractĂšre). Les formes D et C conservent
les caractÚres de compatibilité (ceux qui possÚdent une transformation de compatibilité), alors
que les formes KD et KC les remplacent par le résultat de cette transformation. Ces
remplacements peuvent parfois entraĂźner la perte dâinformation importante, en lâabsence de
balisage complémentaire.
Les formes D et KD transforment les caractÚres précomposés en leurs décompositions
canoniques, alors que les formes C et KC transforment les caractĂšres combinatoires en
caractĂšres prĂ©composĂ©s. Remarquons quâen lâabsence dâun caractĂšre prĂ©composĂ© pour e-rond
(dans ro
le
de la Figure 6-3), les formes C et KC le laissent sous sa forme décomposée.
Toutes ces dĂ©finitions dĂ©coulent des rĂšgles dâĂ©quivalence et de composition exposĂ©es au
chapitre 3, Conformité, et des listes de décompositions de la Base de données de caractÚres
Unicode.
Remarque :
les parties de texte qui ne comprennent que des caractĂšres ASCII
(U+0000 à U+007F) ne sont pas affectées par ces différentes formes de normalisation.
Ceci est particuliĂšrement important pour les langages informatiques (voir 6.12,
Identificateurs dans les langages informatiques).
La forme de normalisation C utilise dans la mesure du possible des caractĂšres canoniques
précomposés et préserve la distinction entre caractÚres équivalents en terme de compatibilité.
Dâordinaire, les chaĂźnes de caractĂšres accentuĂ©s prĂ©composĂ©s Unicode sont dĂ©jĂ sous la forme
de normalisation C. Les mises en Ćuvre qui se bornent Ă utiliser un rĂ©pertoire qui ne reprend
aucun signe combinatoire (comme celles qui disent implanter le niveau 1 dĂ©fini par lâISO/CEI
10646-1) utilisent aussi, habituellement, la forme de normalisation C. Les mises en Ćuvre de
versions ultĂ©rieures de lâISO 10646 doivent considĂ©rer les problĂšmes potentiels liĂ©s aux
différences de versions (voir 6.3, Versions et stabilité).
Le modĂšle de caractĂšres du W3C
3
utilise la forme de normalisation C en XML et dans les
normes connexes Ă celui-ci (ce document nâest pas encore final, mais ce choix de forme de
normalisation devrait rester).
La forme de normalisation KC élimine également les différences entre les caractÚres
compatibles[PA14] que lâon distingue souvent Ă mauvais escient. Câest pourquoi les caractĂšres
katakana de demi-chasse et de pleine chasse sont normalisĂ©s vers une mĂȘme valeur ; il en va
de mĂȘme pour les chiffres romains et leurs lettres correspondantes
4
. La section 6.7, Exemples
et tableaux, fournit de nombreux autres exemples complets.
On veillera Ă ne pas appliquer les formes de normalisations KC et KD sans discernement Ă
nâimporte quel texte. Ces formes rendent impossible la conversion aller-retour entre Unicode et
de nombreux jeux de caractÚres préexistants, car elles éliminent bon nombre de différences de
formatage. Ă moins quâelles ne supplĂ©ent Ă cette suppression par du balisage de formatage
complĂ©mentaire, elles risquent donc dâĂ©liminer des distinctions cruciales Ă la comprĂ©hension du
texte.
3
<http://www.w3.org/TR/WD-charmod>
4
Par exemple, I en chiffre romain
â
la lettre i majuscule, V en chiffre romain
â
la lettre v majuscule
F
ORMES DE
N
ORMALISATION
6.2 N
OTATION
U
NICODE
3.1
ANNOTĂ
165
La meilleure façon dâapprĂ©hender ces formes de normalisation est sans doute de les considĂ©rer
comme analogue Ă un passage en majuscules ou en minuscules : utile parfois pour indiquer le
sens, mais parfois une modification de texte inappropriée. On peut les utiliser avec plus de
liberté pour des applications aux jeux de caractÚres restreints, comme à la section 6.12,
Identificateurs dans les langages informatiques.
En rĂ©sumĂ©, voici lâeffet des formes de normalisation sur les caractĂšres prĂ©composĂ©s de
compatibilité présents dans le texte-source :
âą
les formes D et C conservent les précomposés de compatibilité ;
âą
ni KD ni KC ne conservent les précomposés de compatibilité ;
âą
aucune de ces formes nâintroduit de prĂ©composĂ©s de compatibilitĂ© absents du texte-
source.
Remarque : la forme de normalisation KC ne tente pas de transformer les suites de
caractÚres vers des composés de compatibilité. Ainsi, une composition de compatibilité
de « suffit » ne produit pas "su\uFB03t" bien que â\uFB03â soit un caractĂšre Ă©quivalent
de compatibilité des trois caractÚres « ffi ».
La concatĂ©nation des chaĂźnes nâest fermĂ©e dans aucunes des formes de normalisation.
Considérons les exemples suivants :
Tableau 6-2. La concatĂ©nation nâest pas fermĂ©e
Forme ChaĂźne1
ChaĂźne2
Concaténation
Normalisation correcte
C
"a"
"^"
"a"+"^"
"Ăą"
D
"a"+"^"
"." (point souscrit)
"a"+"^" + "."
"a" + "." +"^"
à moins de limiter le répertoire, il est impossible de concevoir une forme de normalisation dans
laquelle la concaténation simple soit fermée. Au besoin, on peut cependant écrire une fonction
spécialisée qui produit une concaténation normalisée. Par contre, la sélection de sous-chaßnes
est fermĂ©e dans lâensemble des chaĂźnes normalisĂ©es, quelle que soit la forme de normalisation
utilisée.
6.2
Notation
Toutes les dĂ©finitions de ce chapitre reposent sur les rĂšgles dâĂ©quivalence et de dĂ©composition
énoncées au chapitre 3, Conformité, et sur les décompositions et les classes combinatoires
définies dans la Base de données de caractÚres Unicode. Les décompositions doivent respecter
ces rÚgles. On doit, notamment, appliquer récursivement les décompositions définies dans la
Base de donnĂ©es de caractĂšres Unicode ; la chaĂźne-rĂ©sultat doit ensuite ĂȘtre mise en ordre
canonique selon les classes combinatoires des caractĂšres qui la composent. Pour plus de
concision, on utilise la notation suivante.
âą
On abrĂšge les noms ISO 10646 de la maniĂšre suivante:
E-grave
=
U+00C8
LETTRE MAJUSCULE LATINE E ACCENT GRAVE
ka
=
U+30AB
SYLLABE KATAKANA KA
ka_dc
=
U+FF76
SYLLABE KATAKANA KA DEMI-CHASSE
ten
=
U+3099
DIACRITIQUE KATAKANA-HIRAGANA SON VOISĂ
ten_dc
=
U+FF9E
MARQUE KATAKANA DE SON VOISĂ DEMI-CHASSE
6.3 V
ERSIONS ET STABILITĂ
F
ORMES DE
N
ORMALISATION
166
U
NICODE
3.1
ANNOTĂ
âą
On peut dĂ©signer la classe combinatoire dâun caractĂšre X de la maniĂšre suivante :
classeCombinatoire(X).
âą
On peut représenter une suite de caractÚres en séparant les différents noms de
caractĂšre Ă lâaide de « + » ou en utilisant la notation des chaĂźnes.
âą
"...\uxxxx..." reprĂ©sente le caractĂšre Unicode U+xxxx au sein dâune chaĂźne de
caractĂšres.
âą
Un caractĂšre unique Ă©quivalent Ă la suite de caractĂšres B + C peut sâĂ©crire B-C.
âą
On abrĂšge les diffĂ©rentes formes de normalisation dâune chaĂźne C de la maniĂšre
suivante : FND(C), FNKD(C), FNC(C) et FNKD(C). FNX(C) reprĂ©sente nâimporte quelle
forme de normalisation.
âą
On reprĂ©sente les divers types de jamos jointifs (initiaux, mĂ©diaux, finaux) Ă lâaide de
lettres souscrites comme dans k
i
, a
m
et k
f
.
âą
Il est permis dâutiliser des accents avec chasse (sans cercle en pointillĂ©) pour
reprĂ©senter des accents sans chasse : « c, » pour dĂ©signer c suivi dâune cĂ©dille sans
chasse.
6.3
Versions et stabilité
Il est crucial que les formes de normalisation demeurent stables au fil du temps. Ceci signifie
que, si lâon normalise une chaĂźne (qui ne contient pas de caractĂšres non attribuĂ©s) sous une
version dâUnicode, cette chaĂźne doit rester normalisĂ©e dans les versions ultĂ©rieures dâUnicode.
Câest ce quâon appelle lâexigence de rĂ©trocompatibilitĂ©. Afin de la respecter, on dĂ©signe une
version fixe pour le processus de composition. On la nomme la version de composition.
La version de composition correspond à la version 3.1.0 de la Base de données de caractÚres
Unicode. Afin de mieux comprendre lâimportance de la version de composition, supposons que
la version 4.0 dâUnicode ajoute le prĂ©composĂ© Q-caron. Pour les mises en Ćuvre qui utilisent la
version 4.0, les chaĂźnes sous les formes de normalisation C et KC continueront Ă contenir la
suite Q + caron et non le nouveau caractĂšre Q-caron, puisque la composition canonique pour Q-
caron nâavait pas Ă©tĂ© dĂ©finie pour la version de composition. Pour plus dâinformations, voir la
section 6.6, Tableau des compositions exclues.
Remarque : il est possible que de nouvelles compositions soient ajoutées dans des
versions ultĂ©rieures dâUnicode, pour autant que lâexigence de rĂ©trocompatibiliĂ© soit
satisfaite. Ceci signifie que, pour toute nouvelle composition XY
â
Z, X ou Y
doivent ĂȘtre un nouveau caractĂšre, ainsi que Z. Toutefois, Unicode dĂ©courage
fortement la dĂ©finition de nouvelles compositions, mĂȘme quand elles respectent les
restrictions énoncées ci-dessus.
Il ne faut pas seulement Ă©tablir la version de composition pour les prochaines versions
dâUnicode, il est Ă©galement nĂ©cessaire de limiter le genre de modifications qui pourront ĂȘtre
apportĂ©es aux propriĂ©tĂ©s de caractĂšre. Câest pourquoi, le consortium Unicode a Ă©tabli une
politique claire qui garantit la stabilité des formes de normalisation. Pour de plus amples
renseignements, veuillez vous référer aux Lignes de conduite Unicode
5
.
Remarque : la version 3.1 constitue une exception Ă cette ligne de conduite. Voir la
Section 6.15, Corrigendum relatif Ă la normalisation 3.1.
5
<http://www.unicode.org/unicode/standard/policies.html>
F
ORMES DE
N
ORMALISATION
6.4 C
ONFORMITĂ
U
NICODE
3.1
ANNOTĂ
167
6.4
Conformité
C1. Tout processus qui produit du texte Unicode qui se veut dans une forme normalisée doit le
faire conformément aux prescriptions de ce document.
C2. Tout processus qui désire établir si un texte Unicode se présente sous une forme
normalisée doit le faire conformément aux prescriptions de ce document.
C3. Tout processus qui désire transformer du texte en une forme normalisée doit satisfaire au
test de conformité de normalisation
6
.
Remarque :
la définition des formes de normalisation est décrite du point de
vue dâun processus qui produit une dĂ©composition ou une composition Ă
partir dâune chaĂźne Unicode arbitraire. Il sâagit dâune description logique â
certaines mises en Ćuvre peuvent adopter des mĂ©canismes plus efficaces
pour autant quâelles produisent le mĂȘme rĂ©sultat. De mĂȘme, il nâest pas
nĂ©cessaire pour Ă©tablir lâutilisation dâune forme de normalisation particuliĂšre
dâemployer le processus de normalisation, il suffit que le processus utilisĂ©
produise un rĂ©sultat Ă©quivalent Ă une normalisation suivie dâun test dâidentitĂ©
binaire.
6.5
DĂ©finition
Cette section définit les formes de normalisation C et KC. Elle utilise les quatre définitions
suivantes (D1, D2, D3 et D4) ainsi que deux rĂšgles (R1 et R2).
Toutes les suites de caractĂšres combinatoires commencent par un caractĂšre de classe
combinatoire zéro. Afin de simplifier, on définit le terme suivant pour ces caractÚres :
D1. On dit dâun caractĂšre T quâil est une tĂȘte si sa classe combinatoire dans la Base de donnĂ©es
de caractÚres est zéro.
Compte tenu de la dĂ©finition de lâĂ©quivalence canonique, lâordre des caractĂšres combinatoires
de mĂȘme classe combinatoire importe. Ainsi, a-macron-brĂšve nâest-il pas Ă©quivalent Ă a-brĂšve-
macron. On ne peut donc composer des caractĂšres sâil en rĂ©sultait une modification de lâordre
canonique des caractĂšres combinatoires.
D2. Pour toute suite de caractĂšres qui commence par une tĂȘte T, on dit quâun caractĂšre K est
isolĂ© de T si et seulement sâil existe un caractĂšre B entre T et K tel que B est Ă©galement une tĂȘte
ou B appartient Ă la mĂȘme classe combinatoire que K.
Remarque : Quand B isole K, intervertir B et K produit une suite de caractĂšres
qui nâest pas canoniquement Ă©quivalente Ă la suite originelle. Voir la section 3.9,
Mise en ordre canonique.
Remarque : Si une suite de caractÚres combinatoires se présente en ordre
canonique, il suffit dâinspecter le caractĂšre qui prĂ©cĂšde immĂ©diatement un
caractÚre K pour établir si K est isolé ou non.
6
Ă partir dâUnicode 3.0.1, le fichier Ă utiliser pour le test de conformitĂ© de normalisation se trouve sur le disque optique
qui
accompagne
cet
ouvrage ;
une
version
tenue
Ă
jour
est
disponible
Ă
lâadresse
suivante
<http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt>.
Ce
fichier
comprend
une
série
de
champs.
Lâapplication des formes de normalisation aux diffĂ©rents champs devra produire un rĂ©sultat correspondant Ă celui
dĂ©clarĂ© dans lâen-tĂȘte de ce fichier.
6.5 D
ĂFINITION
F
ORMES DE
N
ORMALISATION
168
U
NICODE
3.1
ANNOTĂ
La formation dâune composition sous la forme normalisĂ©e C ou KC implique :
1.
la décomposition de la chaßne en question conformément aux transformations
canoniques (ou de compatibilité) indiquées dans la Base de données de caractÚres
qui correspond Ă la derniĂšre version dâUnicode supportĂ©e par la mise en Ćuvre,
puis
2.
la composition de la chaßne résultante conformément aux transformations
canoniques de la version de composition
7
et cela par compositions successives de
chaque caractĂšre non isolĂ© avec la tĂȘte qui le prĂ©cĂšde.
La figure 6-4 ci-dessous illustre le processus. Les cubes gris reprĂ©sentent les tĂȘtes, les cubes
blancs les autres caractÚres. La premiÚre étape consiste à décomposer complÚtement la chaßne
(les flÚches vers le bas) et à la réordonner. Lors de la seconde étape, représentée par les arcs
flĂ©chĂ©s du bas de la figure, on compare chaque caractĂšre au caractĂšre prĂ©cĂ©dent (autre quâune
tĂȘte) et on le combine Ă la tĂȘte prĂ©cĂ©dente si toutes les conditions sont remplies. Voir les
sections 6.7, Exemples et tableaux et 6.10, Exemples de mise en Ćuvre.
Figure 6-4. Processus de composition
Il faut Ă©galement prĂ©ciser quand il est permis de composer une tĂȘte et un caractĂšre non isolĂ©.
Pour ce faire, on introduit les deux définitions suivantes :
D3. On dit dâun caractĂšre quâil est un caractĂšre prĂ©composĂ© principal sâil fait lâobjet dâune
dĂ©composition canonique dans la Base de donnĂ©es de caractĂšres Unicode (ou sâil sâagit dâune
syllabe hangĂ»l canoniquement dĂ©composable) mais nâapparaĂźt pas dans le Tableau des
compositions exclues. Voir section 6.6, Tableau des compositions exclues.
Remarque : La dĂ©composition dâune syllabe hangĂ»l est considĂ©rĂ©e comme une
décomposition canonique.
D4. On dit dâun caractĂšre X quâil est recomposable avec un caractĂšre Y si, et seulement si, il
existe un caractÚre précomposé principal Z canoniquement équivalent à la suite <X, Y>.
à partir de ces définitions, les rÚgles suivantes définissent les formes de normalisation C et KC.
7
Câest-Ă -dire la version de composition de la Base de donnĂ©es de caractĂšres Unicode.
T
ÂŹ
T
T
T
T
ÂŹ
T
T
T
ÂŹ
T
ÂŹ
T
T
T
T
ÂŹ
T
ÂŹ
T
ÂŹ
T
T
F
ORMES DE
N
ORMALISATION
6.6 T
ABLEAU DES COMPOSITIONS EXCLUES
U
NICODE
3.1
ANNOTĂ
169
R1. F
ORME DE NORMALISATION
C
On obtient la forme de normalisation C dâune chaĂźne de caractĂšres C par lâapplication du
processus suivant ou de tout autre processus produisant le mĂȘme rĂ©sultat :
1.
Produire la dĂ©composition canonique de la chaĂźne dâorigine C conformĂ©ment aux
décompositions répertoriées dans la derniÚre version supportée de la Base de données
de caractĂšres Unicode.
2.
Pour chaque caractÚre K de cette décomposition, en commençant par le premier, si rien
nâisole K de la derniĂšre tĂȘte D et si K est recomposable avec D, remplacer D par le
précomposé D-K et supprimer K.
Le rĂ©sultat de ce processus forme une nouvelle chaĂźne Câ normalisĂ©e sous la forme normalisĂ©e
C.
R2. F
ORME DE NORMALISATION
KC
On obtient la forme de normalisation KC dâune chaĂźne de caractĂšres C par lâapplication du
processus suivant ou de tout autre processus produisant le mĂȘme rĂ©sultat :
1.
Produire la dĂ©composition de compatibilitĂ© de la chaĂźne dâorigine C conformĂ©ment aux
décompositions répertoriées dans la derniÚre version supportée de la Base de données
de caractĂšres Unicode.
2.
Pour chaque caractÚre K de cette décomposition, en commençant par le premier, si rien
nâisole K de la derniĂšre tĂȘte D et si K est recomposable avec D, remplacer D par le
précomposé D-K et supprimer K.
Le rĂ©sultat de ce processus forme une nouvelle chaĂźne normalisĂ©e Câ sous la forme KC.
6.6
Tableau des compositions exclues
Il existe quatre classes de caractĂšres exclues de la composition.
1.
Propres à une écriture : caractÚres précomposés qui ne constituent pas généralement
les formes privilĂ©giĂ©es dâune Ă©criture particuliĂšre.
âą
On ne peut dĂ©terminer ces caractĂšres Ă partir de lâinformation de la Base de
données de caractÚres Unicode.
2.
Postérieurs à la version de composition : caractÚres précomposés rajoutés à la
version 3.0 dâUnicode. Cet ensemble sera mis Ă jour aprĂšs chaque nouvelle version
dâUnicode. Voir la section 6.3, Versions et stabilitĂ©.
âą
On ne peut dĂ©terminer ces caractĂšres Ă partir de lâinformation fournie dans la
Base de données de caractÚres Unicode.
3.
Singletons : caractÚres précomposés dont la décomposition consiste en un seul
caractĂšre (voir la description ci-dessous).
âą
On calcule ces caractĂšres Ă partir de lâinformation fournie dans la Base de
données de caractÚres Unicode.
4.
DĂ©compositions sans tĂȘte : caractĂšres prĂ©composĂ©s dont les dĂ©compositions ne
commencent pas par une tĂȘte.
âą
On calcule ces caractĂšres Ă partir de lâinformation fournie dans la Base de
données de caractÚres Unicode.
La Base de données de caractÚres Unicode peut fournir pour deux caractÚres distincts une
mĂȘme dĂ©composition canonique. Voir lâexemple ci-dessous.
6.7 E
XEMPLES ET TABLEAUX
F
ORMES DE
N
ORMALISATION
170
U
NICODE
3.1
ANNOTĂ
Sources
MĂȘme dĂ©composition
U+212B
SYMBOLE ANGSTRĂM
U+00C5
LETTRE MAJUSCULE LATINE A
ROND EN CHEF
U+0041
LETTRE MAJUSCULE LATINE A
+
U+030A
DIACRITIQUE ROND EN CHEF
La Base de donnĂ©es de caractĂšres Unicode dĂ©composera dâabord un des caractĂšres en lâautre
avant de dĂ©composer ce caractĂšre Ă son tour. En dâautres termes, un des caractĂšres (ici
U+212B
SYMBOLE ANGSTRĂM
)
a une décomposition singleton. Unicode comprend des
caractÚres à décomposition singleton essentiellement pour des raisons de compatibilité avec
des normes et standards préexistants. Ces décompositions singleton ne font pas partie des
compositions principales.
On trouvera un tableau des compositions exclues lisibles mĂ©caniquement Ă lâadresse suivante
<http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt.
Remarquer
que
cette
version corrige lâomission du YOD HIRIK. Voir la Section 6.15, Corrigendum relatif Ă la
normalisation 3.1 pour plus de détails.
Les quatre différentes classes de caractÚres sont incluses dans ce fichier, bien que les
singletons et les dĂ©compositions sans tĂȘte sont mis en commentaires.
6.7
Exemples et tableaux
Cette section Ă©numĂšre quelques exemples de chaque forme de normalisation.
Exemples communs
Les exemples suivants reprĂ©sentent des cas oĂč les formes D et KD sont identiques et les
formes C et KC sont identiques
Original
Formes D, KD
Formes C, KC
Remarques
a
D-point_en_chef
D + point_en_chef
D-point_en_chef
b
D + point_en_chef
D + point_en_chef
D-point_en_chef
Les Ă©quivalents canoniques
précomposées et décom-
posĂ©es produisent le mĂȘme
résultat.
c
D-point_souscrit
+ point_en_chef
D + point_souscrit
+ point_en_chef
D-point_souscrit
+ point_en_chef
d
D-point_en_chef
+ point_souscrit
D + point_souscrit
+ point_en_chef
D-point_souscrit
+ point_en_chef
e
D + point_en_chef
+ point_souscrit
D + point_souscrit
+ point_en_chef
D-point_souscrit
+ point_en_chef
f
D + point_en_chef
+ cornu
+ point_souscrit
D + cornu
+ point_souscrit
+ point_en_chef
D-point_souscrit
+ cornu
+ point_en_chef
Au moment oĂč lâon atteint le
point_en_chef, on ne peut
plus lâadjoindre au caractĂšre
de base.
Il se peut que des signes
combinatoires supplémen-
taires se glissent dans la
suite (voir f) pour autant que
le résultat de la combinaison
soit canoniquement
Ă©quivalente.
g E-macron-grave
E + macron + grave
E-macron-grave
h E-macron + grave
E + macron + grave
E-macron-grave
Adjonction de plusieurs
caractĂšres combinatoires au
caractĂšre de base.
F
ORMES DE
N
ORMALISATION
6.7 E
XEMPLES ET TABLEAUX
U
NICODE
3.1
ANNOTĂ
171
i
E-grave + macron
E + grave + macron
E-grave + macron
Le macron ne se combine
pas, puisque E-grave-
macron nâexiste pas et E-
macron-grave nâest pas
canoniquement Ă©quivalent.
j
signe_angstrom
A + rond
A-rond
k
A-rond
A + rond
A-rond
On utilise la forme Ă
(A-
rond) pour les deux
caractĂšres, car il sâagit du
précomposé recommandé.
Exemples des formes de normalisation D et C
Ces exemples de formes D et C illustrent leurs différences respectives avec les formes KD et
KC.
Original
Forme D
Forme C
Remarques
l
"Ăffin"
"A\u0308ffin"
"Ăffin"
m "Ă\uFB03n"
"A\u0308\uFB03n"
"Ă\uFB03n"
La ligature_ffi (U+FB03)
nâest pas dĂ©composĂ©e, car
si elle possĂšde une
décomposition de compa-
tibilitĂ©, elle nâen a pas de
canonique. (Voir ci-
dessous Exemples des
formes de normalisation
KD et KC.)
n
"Henri IV"
"Henri IV"
"Henri IV"
o
"Henri \u2163"
"Henri \u2163"
"Henri \u2163"
De mĂȘme, le CHIFFRE
ROMAIN IV (U+2163) nâest
pas décomposé.
p
ga
ka + ten
ga
q
ka + ten
ka + ten
ga
r
ka_dc + ten_dc
ka_dc + ten_dc
ka_dc + ten_dc
s
ka + ten_dc
ka + ten_dc
ka + ten_dc
t
ka_dc + ten
ka_dc + ten
ka_dc + ten
Les différents équivalents
de compatibilitĂ© dâun
mĂȘme caractĂšre japonais
ne produisent pas la mĂȘme
chaßne normalisée sous la
forme C.
u
kaks
k
i
+ a
m
+ ks
f
kaks
Les normalisations
conservent les syllabes
hangûl.
Exemples des formes de normalisation KD et KC
Ces exemples de formes KD et KC illustrent leurs différences respectives avec les formes D et
C.
Original
Forme KD
Forme KC
Remarques
l'
"Ăffin"
"A\u0308ffin"
"Ăffin"
m' "Ă\uFB03n"
"A\u0308\ffin"
"Ăffin"
La ligature_ffi (U+FB03)
est décomposée pour la
forme de normalisation KC
(alors quâelle ne lâest pas
dans la forme de
normalisation C).
6.8 O
BJECTIFS DE CONCEPTION
F
ORMES DE
N
ORMALISATION
172
U
NICODE
3.1
ANNOTĂ
n' "Henri IV"
"Henri IV"
"Henri IV"
o' "Henri \u2163"
"Henri IV"
"Henri IV"
Ici Ă©galement, les chaĂźnes
normalisées sont iden-
tiques pour la forme de
normalisation KC.
p' ga
ka + ten
ga
q' ka + ten
ka + ten
ga
r'
ka_dc + ten_dc
ka + ten
ga
s'
ka + ten_dc
ka + ten
ga
t'
ka_dc + ten
ka + ten
ga
Les différents équivalents
de compatibilitĂ© dâun
mĂȘme caractĂšre japonais
produisent la mĂȘme chaĂźne
normalisée sous la forme
KC.
u' kaks
k
i
+ a
m
+ ks
f
kaks
Les normalisations conser-
vent les syllabes hangûl.
* Dans les premiĂšres versions dâUnicode, les caractĂšres jamos composĂ©s comme ks
f
avaient
une décomposition de compatibilité de type k
f
+ s
f
. La version 2.1.9 dâUnicode a Ă©liminĂ© ces
correspondances afin de préserver les syllabes hangûl.
6.8
Objectifs de conception
On trouvera ci-dessous les objectifs qui sous-tendent la conception des formes de
normalisation.
Objectif 1 : Unicité
LâunicitĂ© est le premier, et de loin le plus important, objectif de conception des formes de
normalisation. Ceci signifie que deux chaĂźnes Ă©quivalentes doivent avoir prĂ©cisĂ©ment la mĂȘme
forme normalisée. De façon explicite :
1.
Si deux chaĂźnes x et y sont canoniquement Ă©quivalentes, alors
âą
C(x) = C(y)
âą
D(x) = D(y)
2. Si deux chaßnes x et y sont des équivalents de compatibilité, alors
âą
KC(x) = KC(y)
âą
KD(x) = KD(y)
Objectif 2 : Stabilité
Le deuxiĂšme objectif de conception est la prĂ©servation des caractĂšres qui nâinterviennent pas
dans le processus de composition ou de décomposition.
1.
Si X contient un caractÚre ayant une décomposition de compatibilité, alors D(X) et C(X)
contiennent toujours ce caractĂšre.
2.
Dans la mesure du possible, si X ne comprend pas de caractĂšre combinatoire alors
C(X) = X.
3.
Les signes combinatoires non pertinents ne doivent pas influer sur le résultat des
compositions. Voir lâexemple f Ă la section 6.7, Exemples et tableaux, oĂč le caractĂšre
cornu nâa pas dâincidence sur le rĂ©sultat des compositions.
Remarque : Les seuls caractĂšres pour lesquels lâobjectif 2.2 ne se vĂ©rifie pas sont ceux
énumérés dans la section 6.6, Tableau des compositions exclues.
F
ORMES DE
N
ORMALISATION
6.9 N
OTES DE MISE EN ĆUVRE
U
NICODE
3.1
ANNOTĂ
173
Objectif 3 : Efficacité
Le troisiĂšme objectif de conception est de permettre des mises en Ćuvre efficaces.
1.
Il est possible de produire les formes de normalisation Ă lâaide de code efficace. Plus
particuliĂšrement, on doit ĂȘtre en mesure de produire trĂšs rapidement la forme de
normalisation C à partir des chaßnes qui sont déjà en forme de normalisation C ou D.
2.
Les formes de compositions ne doivent pas nécessairement produire les résultats les
plus concis car cela peut entraĂźner des calculs excessifs.
6.9
Notes de mise en Ćuvre
On peut optimiser de diverses façons les programmes qui produisent la forme de
normalisation C. PlutÎt que de commencer par la décomposition du texte au complet, on peut,
par exemple, vérifier rapidement chaque caractÚre. Si celui-ci est déjà dans la forme
prĂ©composĂ©e adĂ©quate alors on passe au caractĂšre suivant sans autre procĂšs. On nâinvoque du
code plus complexe que dans le cas oĂč le caractĂšre courant est combinatoire ou sâil appartient
au Tableau des compositions exclues (voir la section 6.6). Dans ce cas, il faudra vérifier les
caractĂšres prĂ©cĂ©dents jusquâĂ la derniĂšre tĂȘte. Voir la section 6.13, DĂ©tection des formes de
normalisation pour un complĂ©ment dâinformation.
Lors de la composition, la majorité du temps de calcul se passe à extraire les données
appropriĂ©es. La consultation des donnĂ©es pour la forme de normalisation C peut ĂȘtre mise en
Ćuvre de maniĂšre trĂšs efficace car elle nâimplique que des paires de caractĂšres et non des
chaĂźnes arbitraires. On utilise dâabord un tableau Ă plusieurs niveaux (Ă©galement appelĂ© un trie,
voir le chapitre 5) pour faire correspondre au caractĂšre c un petit entier i appartenant Ă un
intervalle continu de 0 Ă n. Le code pour ce faire ressemble Ă :
i = données[indexe[c >> GLISSEMENTBLOC] + (c & MASQUEBLOC)];
Ensuite, Ă lâaide dâune matrice, on fait correspond Ă une paire de ces petits entiers la valeur
résultat. Cet algorithme est bien plus efficace que ceux qui utilisent des méthodes universelles
comme les tables de hachage.
Les compositions et décompositions hangûl sont algorithmiques, on peut donc réduire
radicalement les besoins en mĂ©moire si lâon code les opĂ©rations correspondantes Ă lâaide
dâinstructions plutĂŽt que de grandes matrices Voir la section 6.14, HangĂ»l, pour plus
dâinformations.
Remarque : il est important de sâassurer que la mise en Ćuvre produit bien des
résultats conformes. à cette fin, elle doit réussir les tests de conformité de normalisation
prévus : <http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt>.
6.10 E
XEMPLES DE MISE EN ĆUVRE
F
ORMES DE
N
ORMALISATION
174
U
NICODE
3.1
ANNOTĂ
6.10 Exemples de mise en Ćuvre
Le consortium Unicode fournit des programmes-modĂšles pour chacune des quatre formes de
normalisation. Pour plus de clarté, ces modÚles ne sont pas optimisés. Dans les cas des formes
C et KC, ils transforment une chaßne en deux passes : une décomposition suivie de
recompositions successives de chacun des caractĂšres non isolĂ©s avec la derniĂšre tĂȘte.
Pour certaines mises en Ćuvre, il se peut que les caractĂšres en entrĂ©e ou en sortie soient
fournis par petits paquets. Il est alors nĂ©cessaire de stocker dans un tampon le texte jusquâĂ la
derniĂšre tĂȘte. On peut vider le tampon dĂšs quâon dĂ©sire insĂ©rer une seconde tĂȘte.
Les modĂšles sont Ă©crits en Java, toutefois â afin dâĂȘtre plus accessibles â ils nâemploient pas de
techniques orientées objet. Le code de ces modÚles et une démonstration interactive sont
disponibles
8
. Le W3C fournit sur son site du code Perl Ă©quivalent
9
.
6.11 Codages préexistants
Bien que les formes de normalisation soient destinées à qualifier du texte Unicode, elles
peuvent Ă©galement ĂȘtre utilisĂ©es pour les codages de caractĂšres non-Unicode, en dâautres mots
les codages préexistants. Pour ce faire, on effectue une correspondance aller-retour entre le jeu
de caractÚres préexistant et Unicode en utilisant les définitions D5 et D6.
D5. Un transcodage inversible T pour un jeu de caractÚres préexistant P est une relation
bijective entre les caractĂšres codĂ©s de P et les caractĂšres dâUnicode telle que la relation inverse
T
-1
, appliquĂ©e Ă toute chaĂźne C de P, vĂ©rifie lâĂ©quation T
-1
(T(C)) = C.
Remarque 1 : On admet habituellement un seul transcodage pour un jeu de
caractÚres préexistant donné. Il se peut cependant que plusieurs transcodages
existent, câest le cas du Shift-JIS auquel on peut associer deux transformations,
lâune pour conserver la signification « / » de 2F
16,
lâautre pour conserver la
signification « „ ».
Remarque 2 : La position des caractĂšres dans la chaĂźne codĂ©e Ă lâaide du jeu
prĂ©existant peut ĂȘtre trĂšs diffĂ©rente de celle des caractĂšres Ă©quivalents en
Unicode. Ainsi, si la chaĂźne prĂ©existante utilise un codage visuel de lâhĂ©breu, le
premier caractĂšre peut devenir le dernier caractĂšre de la chaĂźne Unicode.
Il est préférable que les routines de transcodage destinées aux jeux de caractÚres préexistants
produisent, dans la mesure du possible, des chaßnes normalisées sous la forme C. Pour plus
dâinformations, veuillez vous rĂ©fĂ©rer au rapport technique Unicode n° 22, Character Mapping
Tables.
D6. Soit une chaßne C codée en P et un transcodage inversible T pour P, on définit la forme de
normalisation X de C sous T comme étant le résultat des opérations suivantes : transformation
vers Unicode, normalisation vers la forme X et transformation inverse vers le codage de
caractĂšres dâorigine, câest Ă dire T
.-1
(FNX(T(C))). Quand on nâadmet quâun seul transcodage
inversible pour un jeu de caractÚres donné, on peut alors simplement parler de la forme de
normalisation X de C.
On classe les jeux de caractÚres préexistants en trois catégories selon leur comportement lors
de la normalisation avec les transcodeurs acceptés.
8
<http://www.unicode.org/unicode/reports/tr15/Normalizer.html>.
9
<http://www.w3.org/International/charlint>
F
ORMES DE
N
ORMALISATION
6.12 I
DENTIFICATEURS DANS LES LANGAGES INFORMATIQUES
U
NICODE
3.1
ANNOTĂ
175
âą
Prénormalisé : toute chaßne dans le jeu de caractÚres est déjà en forme normalisée X.
o
Exemple : ISO 8859-1 est prénormalisée en forme normalisée C.
âą
Normalisable : bien que le jeu de caractÚres ne soit pas prénormalisé, toute chaßne du
jeu peut ĂȘtre normalisĂ©e sous la forme X.
o
Exemple : lâISO 2022 (avec une dose dâISO 5426 et dâISO 8859-1) est
normalisable.
âą
Non normalisable : Certaines chaßnes formées à partir du jeu de caractÚres ne peuvent
ĂȘtre normalisĂ©es sous la forme X.
o
Exemple : lâISO 5426 nâest pas normalisable sous la forme C par les
transcodeurs ordinaires car elle contient des signes combinatoires sans en
contenir des formes précomposées.
6.12 Identificateurs dans les langages informatiques
Cette section aborde les problÚmes liés à la normalisation des identificateurs dans les langages
de programmation ou de script informatiques. Le standard Unicode recommande une syntaxe
pour les identificateurs de langage informatique qui permet lâutilisation de caractĂšres non-ASCII
au sein de ces identificateurs. Il sâagit dâun prolongement naturel de la syntaxe des
identificateurs utilisée pour le C et plusieurs autres langages informatiques.
<identificateur> ::= <début_identificateur> (<début_identificateur> |
<suite_identificateur> )*
<début_identificateur> ::= [{Lu}{Ll}{Lt}{Lm}{Lo}{Nl}]
<suite_identificateur> ::= [{Mn}{Mc}{Nd}{Pc}{Cf}]
En dâautres mots, le premier caractĂšre dâun identificateur peut ĂȘtre une lettre majuscule,
minuscule, en casse de titre, une lettre modificative, une autre lettre ou une lettre numérale. Les
caractĂšres
subséquents
dâun
identificateur
peuvent
appartenir
Ă
une
des
catégories
susmentionnées ou encore aux signes combinatoires avec ou sans chasse, aux chiffres
décimaux, à la ponctuation connective et aux codes de formatage (par exemple les marques
gauche-à -droite). En rÚgle générale, on éliminera les codes de formatage avant toute
comparaison ou stockage.
On peut utiliser les formes de normalisation décrites dans ce chapitre pour éviter que des
identificateurs apparemment identiques ne soient pas traités de maniÚre équivalente. De tels
problĂšmes peuvent surgir lors de la compilation ou de lâĂ©dition des liens, plus particuliĂšrement
lorsquâon utilise diffĂ©rents langages de programmation. Afin de prĂ©venir de tels dĂ©sagrĂ©ments,
les compilateurs devraient normaliser les identificateurs avant de les stocker ou de les
comparer. Le plus souvent, si un langage de programmation distingue la casse de ses
identificateurs, on utilisera alors la forme de normalisation C (FNC). Dans le cas contraire, on
adoptera la forme de normalisation KC (FNKC) généralement plus adaptée.
Si un langage de programmation utilise la FNKC pour uniformiser (« plier ») les différences entre
caractÚres, il faut alors modifier légÚrement la syntaxe des identificateurs fournie ci-dessus afin
de traiter correctement les particularismes dâun petit nombre de caractĂšres. Ces caractĂšres se
classent en trois catégories :
6.12 I
DENTIFICATEURS DANS LES LANGAGES INFORMATIQUES
F
ORMES DE
N
ORMALISATION
176
U
NICODE
3.1
ANNOTĂ
1.
Point médian. La plupart des textes catalans préexistants sont codés en Latin-1, il faut
donc admettre U+00B7
POINT MĂDIAN
dans la <suite_identificateur>. (Si le langage de
programmation utilise un point comme opérateur, il faut alors distinguer son utilisation et
plutĂŽt utiliser U+2219
OPĂRATEUR PUCE
ou U+22C5
OPĂRATEUR POINT
. Il faut
toutefois traiter U+00B7
POINT MĂDIAN
avec beaucoup de précautions puisque de
nombreux processus pourraient le considérer comme une marque de ponctuation plutÎt
quâun modificateur de digramme
10
).
2.
CaractĂšres combinatoĂŻdes. Certains caractĂšres, bien quâils ne soient pas Ă strictement
parler des caractĂšres combinatoires, se comportent comme sâils en Ă©taient. En principe,
ces caractÚres ne devraient pas faire partie de <début_identificateur>, mais bien de la
<suite_identificateur> en compagnie des autres caractĂšres combinatoires. Dans la
plupart des cas, la mauvaise affectation de ces caractĂšres ne pose pas problĂšme.
Cependant, quand ces caractÚres possÚdent des décompositions de compatibilité, il se
peut alors que la normalisation KC de ne soit plus fermĂ©e dans lâensemble des
identificateurs. Il faut plus particuliĂšrement sâassurer que les quatre caractĂšres suivants
fassent partie de <suite_identificateur> et non de <début_identificateur> :
o
0E33
LETTRE THAĂE SARA AM
11
o
0EB3
VOYELLE DIACRITIQUE LAOTIENNE AM
o
FF9E
MARQUE KATAKANA DE SON VOISĂ DEMI-CHASSE
o
FF9F
MARQUE KATAKANA DE SON SEMI-VOISĂ DEMI-CHASSE
3.
CaractÚres à décomposition irréguliÚre. U+037A
CARACTĂRE GREC IOTA SOUSCRIT
et certaines formes de présentation arabes ont des décompositions de compatibilité
irréguliÚre
12
.
Il
faut
exclure
ces
caractĂšres
de
<début_identificateur>
et
<suite_identificateur>. On prĂ©conise dâailleurs dâexclure des identificateurs toutes les
formes de prĂ©sentation arabes mĂȘme sâil suffit dâen exclure quelques-unes pour
sâassurer que la normalisation des identificateurs sera fermĂ©e.
Avec ces amendements apportés à la syntaxe des identificateurs, toutes les formes de
normalisation sont fermées pour tous les identificateurs.
Ceci signifie donc que, pour toute
chaĂźne C,
estIdentificateur(C) implique
estIdentificateur(FND(C))
estIdentificateur(FNC(C))
estIdentificateur(FNKD(C))
estIdentificateur(FNKC(C))
Les modifications de casse sont également fermées pour tous (à une exception prÚs) les
identificateurs, de telle sorte que pour toute chaĂźne C,
estIdentificateur(C) implique
estIdentificateur(enMajuscules(C))
10
Le point médian (« punt volat » en catalan) apparaßt dans le digramme du l géminé (
l
·
l
) et le distingue du digramme
du l mouillé (
ll
).
11
La classe de U+0E33 = {Lo}, classe valable pour un <début_identificateur>, alors que le premier caractÚre de sa
décomposition de compatibilité (U+0E4D
LETTRE THAĂE NIKHAHIT) a pour classe {Mn} qui ne peut pas faire partie
de <début identificateur>.
12
U+037A est une lettre modificative {Lm} dont la dĂ©composition de compatibilitĂ© est une espace {Zs} suivie dâun iota
souscrit sans chasse {Mn}. Lâespace ne fait partie des caractĂšres admis dans les identificateurs.
F
ORMES DE
N
ORMALISATION
6.13 D
ĂTECTION DES FORMES DE NORMALISATION
U
NICODE
3.1
ANNOTĂ
177
estIdentificateur(enMinuscules(C))
estIdentificateur(enCassePliée(C))
Lâexception mentionnĂ©e est le caractĂšre U+0345
Ć
DIACRITIQUE GREC IOTA SOUSCRIT.
Dans les
cas extrĂȘmement rares oĂč lâU+0345
Ć
DIACRITIQUE GREC IOTA SOUSCRIT
est le premier caractĂšre
de C, U+0345 ne fait pas partie de <début_identitificateur>, mais sa forme majuscule
13
et Ă
casse « pliée » si. En pratique, cela ne pose cependant pas de problÚme étant donné la
maniĂšre dont on utilise la normalisation avec les identificateurs.
Remarque : Les langages de programmation aux identificateurs insensibles Ă la
casse doivent utiliser les transformations de casse définies dans le rapport
technique Unicode n° 21, Case Mappings, afin de produire une forme normalisée
insensible Ă la casse.
Il faut analyser le programme source Ă la recherche dâidentificateurs avant dâuniformiser (de
« plier ») les diffĂ©rences par lâapplication des transformations de casse ou de la forme
normalisée KC. Bien sûr, il ne faut effectuer ce pliage ni sur des chaßnes littérales ni sur des
commentaires présents dans le texte du programme.
Remarque : Unicode 3.1 prĂ©voit des propriĂ©tĂ©s dĂ©rivĂ©es que les mises en Ćuvre
peuvent utiliser pour analyser des identificateurs, normalisĂ©s ou non. Il sâagit des
propriétés
ID
_
Start
,
ID
_
Continue
,
XID
_
Start
,
XID
_
Continue
. Unicode 3.1
facilite également la prise en charge du « pliage » de casse dans le cadre de la
normalisation : on peut utiliser la propriété FNC lors du pliage de casse de telle sorte
que le rĂ©sultat du pliage de casse dâune chaĂźne FNKC est Ă©galement une chaĂźne
normalisée. DerivedProperties.html
14
prĂ©cise lâemplacement de ces propriĂ©tĂ©s et les
fichiers qui les contiennent.
6.13 DĂ©tection des formes de normalisation
Le tableau de données du fichier NormalizationQuickCheck
15
peut servir à déterminer
rapidement si une chaßne se trouve sous une forme normalisée particuliÚre. Ces données ne
sont quâinformatives car on peut les reproduire Ă partir de la Base de donnĂ©es de caractĂšres
Unicode. Pour chaque forme de normalisation, le tableau attribue à chaque numéro de
caractĂšre une variable ternaire. Cette variable peut avoir les valeurs suivantes :
âą
NON indique que ce point de code ne peut se présenter pour cette forme de
normalisation.
âą
OUI indique que ce point de code peut se prĂ©senter, pour peu quâil soit en ordre
canonique, mais sans aucune autre contrainte.
âą
PEUTĂTRE indique que ce point de code peut se prĂ©senter, pour peu quâil soit en ordre
canonique et que quelques contraintes supplĂ©mentaires soient respectĂ©es. En dâautres
mots, le texte nâest peut-ĂȘtre pas sous cette forme normalisĂ©e, si le point de code en
question est précédé par certains autres caractÚres.
13
La lettre iota majuscule.
14
<
http://www.unicode.org/Public/UNIDATA/DerivedProperties.html >, les fichiers les plus importants sont :
<http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProperties.txt> et
<http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt>.
15
<http://www.unicode.org/unicode/reports/tr15/NormalizationQuickCheck.html>
6.13 D
ĂTECTION DES FORMES DE NORMALISATION
F
ORMES DE
N
ORMALISATION
178
U
NICODE
3.1
ANNOTĂ
Les programmes qui utilisent ces propriétés peuvent rapidement inspecter la chaßne en question
lors dâune premiĂšre passe pour vĂ©rifier la forme de normalisation. Le rĂ©sultat de cette inspection
peut ĂȘtre NON, OUI ou PEUTĂTRE. Pour OUI et NON, la question est tranchĂ©e. Dans le cas de
PEUTĂTRE, il faut effectuer un examen plus approfondi. En rĂšgle gĂ©nĂ©rale, on normalise alors
toute la chaĂźne sous la forme considĂ©rĂ©e et on la compare ensuite Ă lâoriginal.
Cette vĂ©rification est nettement plus rapide que lâapplication directe de lâalgorithme de
normalisation, puisquâelle nâalloue aucune mĂ©moire et nâeffectue aucune copie. Pour la grande
majorité des chaßnes, la réponse sera OUI ou NON. Un faible pourcentage nécessite donc un
supplĂ©ment de travail. Le code ci-dessous est en Java, bien que â pour des raisons de lisibilitĂ© â
il nâemploie pas de techniques orientĂ©es objet.
public int vérifRapide (String source) {
short derniĂšreClasseCanonique = 0;
int résultat = OUI;
for (int i = 0; i < source.length(); ++i) {
char car = source.charAt(i);
short classeCanonique = obtenirClasseCanonique (car);
if (derniĂšreClasseCanonique > classeCanonique && classeCanonique != 0){
return NON;
}
int vérif = estPermis(car);
if (vérif == NON) return NON;
if (vĂ©rif == PEUTĂTRE) rĂ©sultat = PEUTĂTRE;
}
return résultat;
}
public static final int NON = 0, OUI = 1, PEUTĂTRE = -1;
Lâappel
estPermis()
devrait accéder aux données
16
qui correspondent Ă la forme de
normalisation en question. Pour plus dâinformations, veuillez vous rĂ©fĂ©rer au fichier
DerivedProperties.html faisant partie de la Base de données de caractÚres Unicode pour
Unicode 3.1. En guise dâexemple, voici un extrait de ces donnĂ©es pour FNC :
...
0338
; NFC_MAYBE # Mn DIACRITIQUE BARRE OBLIQUE LONGUE COUVRANTE
...
F900..FA0D ; NFC_NO
# Lo [270]
# IDĂOGRAMME DE COMPATIBILITĂ CJC-F900
# IDĂOGRAMME DE COMPATIBILITĂ CJC -FA0D
...
Ces lignes affectent la valeur NFC_MAYBE (PEUTĂTRE) au numĂ©ro de caractĂšre U+0338 et la
valeur NFC_NO (NON) aux numĂ©ros de caractĂšre appartenant Ă lâintervalle U+F900 .. U+FA0D.
Remarquon quâon ne trouve aucune valeur PEUTĂTRE pour les FND et FNKD : la fonction
vérifRapide
doit donc toujours produire un résultat décisif pour ces formes de normalisation.
La valeur implicite pour tous les caractĂšres absents des fichiers est OUI.
Les donnĂ©es nĂ©cessaires Ă la mise en Ćuvre de
estPermis()
peuvent ĂȘtre accĂ©dĂ©es Ă lâaide
dâune table de hachage ou dâun « trie » (un tableau multiĂ©tape, voir la Section 6.9, Notes de
mise en Ćuvre). Cette derniĂšre mĂ©thode est la plus rapide.
16
<http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProperties.txt>
F
ORMES DE
N
ORMALISATION
6.14 H
ANGĂL
U
NICODE
3.1
ANNOTĂ
179
6.14 Hangûl
Les
compositions
et
décompositions
hangûl
Ă©tant
algorithmiques,
on
peut
réduire
substantiellement les besoins de mĂ©moire en effectuant les opĂ©rations correspondantes grĂące Ă
du code supplĂ©mentaire plutĂŽt quâen stockant les donnĂ©es dans des tableaux On trouvera ci-
dessous un programme qui illustre la composition et la décomposition canoniques hangûl
conformément à la section 3.11, Comportement des jamos jointifs. Bien que cet exemple soit
codĂ© en Java, on peut utiliser la mĂȘme structure dans dâautres langages de programmation.
Constantes communes
static final int
BaseS = 0xAC00, BaseI = 0x1100, BaseV = 0x1161, BaseF = 0x11A7,
CompteI = 19, CompteV = 21, CompteF = 28,
CompteN = CompteV * CompteF,
// 588
CompteS = CompteI * CompteN;
// 11172
Décomposition hangûl
public static String décomposerHangûl(char s) {
int IndexS = s - BaseS;
if (IndexS < 0 || IndexS >= CompteS) {
return String.valueOf(s);
}
StringBuffer résultat = new StringBuffer();
int I = BaseI + IndexS / CompteN;
int V = BaseV + (IndexS % CompteN) / CompteF;
int F = BaseF + IndexS % CompteF;
résultat.append((char)I);
résultat.append((char)V);
if (F != BaseF) résultat.append((char)F);
return résultat.toString();
}
Composition hangûl
Remarquez une caractéristique importante de la composition hangûl : lorsque la chaßne
dâorigine nâest pas sous la forme normalisĂ©e D, il est insuffisant de dĂ©tecter uniquement les
suites de caractÚres de type <I, V> ou <I, V, F>. Il faut également déceler les suites de type <IV,
F>. Afin de garantir lâunicitĂ©, il faut Ă©galement composer ces suites. LâĂ©tape 2 ci-dessous illustre
cet aspect de la composition.
public static String composerHangûl(String source) {
int lon = source.length();
if (lon == 0) return "";
StringBuffer résultat = new StringBuffer();
char dernier = source.charAt(0);
// copier premier car
résultat.append(dernier);
for (int i = 1; i < lon; ++i) {
char car = source.charAt(i);
// 1. VĂ©rifier si les deux caractĂšres courants sont I et V
int IndexI = dernier - BaseI;
if (0 <= IndexI && IndexI < CompteI) {
int IndexV = car - BaseV;
if (0 <= IndexV && IndexV < CompteV) {
// former une syllabe de type IV
dernier = (char)(BaseS + (IndexI * CompteV + IndexV) *
CompteF);
6.14 H
ANGĂL
F
ORMES DE
N
ORMALISATION
180
U
NICODE
3.1
ANNOTĂ
résultat.setCharAt(résultat.length()-1, dernier);
// réinitialiser dernier
continue; // ignorer car
}
}
// 2. VĂ©rifier si les deux caractĂšres courants sont IV et F
int IndexS = dernier - BaseS;
if (0 <= IndexS && IndexS < CompteS && (IndexS % CompteF) == 0) {
int IndexF = car - BaseF;
if (0 <= IndexF && IndexF <= CompteF) {
// former une syllabe de type IVF
dernier += IndexF;
résultat.setCharAt(résultat.length()-1, dernier);
// réinitialiser dernier
continue; // ignorer car
}
}
// Si aucun des deux cas, simplement ajouter le caractĂšre
dernier = car;
résultat.append(car);
}
return résultat.toString();
}
On peut, pour différentes raisons, effectuer des transformations supplémentaires sur les suites
de jamos. Ainsi, on peut insĂ©rer des bourres tchâĂŽsong et djoungsong pour rendre ces suites de
jamos hangûl réguliÚres selon la définition
17
du chapitre 3. Pour les suites saisies au clavier, il
se peut quâil faille effectuer dâautres compositions. On peut par exemple combiner la suite de
consonnes finales k
f
+ s
f
en ks
f
. De surcroĂźt, certaines mĂ©thodes dâentrĂ©e hangĂ»l ne forcent pas
lâutilisateur Ă distinguer les formes initiales et finales des consonnes et les modifient selon le
contexte. Ainsi, dans la suite saisie au clavier m
i
+ Ă©
m
+ n
i
+ s
i
+ a
m
, la mĂ©thode dâentrĂ©e
interprĂšte la consonne n
i
comme n
f
, car il nâexiste pas de syllabe nsa. On aura donc comme
rĂ©sultat deux syllabes : mĂ©n et sa. Il faut cependant souligner quâaucune de ces transformations
supplémentaires ne fait partie des formes de normalisation Unicode.
Noms des caractÚres hangûl
On utilise également la décomposition hangûl pour déterminer le nom des caractÚres qui
représentent les syllabes hangûl. Bien que le code ci-dessus ne fasse pas à proprement parler
partie de la normalisation, il vaut la peine de lâinclure car il sâapparente Ă©normĂ©ment au code de
la décomposition.
public static String obtenirNomHangûl (char s) {
int IndexS = s - BaseS;
if (0 > IndexS || IndexS >= CompteS) {
throw new IllegalArgumentException("Pas une syllabe hangûl :" + s);
}
StringBuffer résultat = new StringBuffer();
int IndexI = IndexS / CompteN;
int IndexV = (IndexS % CompteN) / CompteF;
17
Le texte anglais de la norme Unicode 2.0 nomme ces suites réguliÚres de jamos des « suites normalisées ».
Toutefois celles-ci nâont rien Ă voir avec la composition ou la dĂ©composition canonique.
F
ORMES DE
N
ORMALISATION
6.15 C
ORRIGENDUM RELATIF Ă LA NORMALISATION
3.1
U
NICODE
3.1
ANNOTĂ
181
int IndexF = IndexS % CompteF;
return "SYLLABE HANGĂL "
+ TABLEAU_JAMOS_I[IndexI]
+ TABLEAU_JAMOS_V[IndexV] + TABLEAU_JAMOS_F[IndexF];
}
static private String[] TABLEAU_JAMOS_I = {
"K", "KK", "N", "T", "TT", "L", "M", "P", "PP",
"S", "SS", "", "TCH", "TCHTCH", "TCH'", "K'", "T'", "P'", "H"
};
static private String[] TABLEAU_JAMOS_V = {
"A", "Ă", "YA", "YĂ", "O", "Ă", "YO", "YĂ", "Ă",
"WA", "WĂ", "EU", "YĂ", "OU", "WO", "WĂ", "WI",
"YOU", "Ă", "ĂI", "I"
};
static private String[] TABLEAU_JAMOS_F = {
"", "K", "KK", "KS", "N", "NTCH", "NH", "T", "L", "LK", "LM",
"LP", "LS", "LT'", "LP'", "LH", "M", "P", "PS",
"S", "SS", "NG", "TCH", "TCH'", "K'", "T'", "P'", "H"
};
6.15 Corrigendum relatif Ă la normalisation 3.1
Lors de la production des tableaux de normalisation pour Unicode 3.0, U+FB1D
LETTRE
HĂBRAĂQUE YOD HIRIK
a par erreur été omis du fichier des compositions exclues. Pendant la
pĂ©riode de rĂ©vision publique, cette erreur fut signalĂ©e sans ĂȘtre prise en considĂ©ration. Unicode
3.1 inclut désormais ce caractÚre parmi les compositions exclues.
Cette modification nâaffecte pas la rĂ©trocompatibilitĂ© des formes de normalisation KC
et C des chaßnes qui comprennent ce caractÚre. Il est conseillé à toutes les mises en
Ćuvre de passer Ă la version 3.1 des tableaux de donnĂ©es Unicode.
Lignes de conduites. Le comitĂ© technique Unicode a autorisĂ© quâon apporte une modification
modifie aux Compositions exclues afin de remédier à cette omission. Le comité directeur du
consortium Unicode a également approuvé ce changement. Les raisons de cette décision
exceptionnelle sont les suivantes :
âą
Cette omission avait été signalée pendant la période de révision publique pour
Unicode 3.0.
âą
Selon nos organes de liaison (particuliĂšrement lâIETF et le W3C), aucun texte normatif
ne se référait à la Normalisation Unicode 3.0 ; bien que de prochaines normes devraient
sous peu faire référence à Unicode 3.1.
âą
YOD HIRIK appartient à une classe de caractÚres (les formes de présentation
hĂ©braĂŻques situĂ©es dans lâintervalle U+FB1D .. U+FB4E) qui ont fait lâobjet dâun
traitement identique par le comitĂ© technique dâUnicode pendant toutes les discussions et
examens relatifs Ă la Normalisation. Tous les autres caractĂšres de cette classe se sont
vus inclus sans exception parmi les Compositions exclues.
âą
YOD HIRIK est un caractĂšre extrĂȘmement rare. La proportion de donnĂ©es qui incluent
actuellement ce caractĂšre est infime par rapport Ă tous les textes informatisĂ©s. MĂȘme si
la mise Ă niveau des mises en Ćuvre pouvait prendre quelque temps, ce changement
nâentraĂźne dans la pratique aucun problĂšme significatif de rĂ©trocompatibilitĂ©.
Ă lâavenir, il ne sera plus admis aucun autre changement aux normalisations qui pourrait affecter
la rétrocompatibilité, car aucun autre caractÚre ne remplira ces conditions.