POD2-FR
view release on metacpan or search on metacpan
FR/perluniintro.pod view on Meta::CPAN
code Unicode, que ce soit un caractère de base ou un caractère
combinatoire.
Pour certaines combinaisons, il existe des caractères I<précomposés>.
Par exemple C<LATIN CAPITAL LETTER A WITH ACUTE> est défini comme un
point de code unique. Ces caractères précomposés ne sont disponibles
que pour certaines combinaisons et le sont principalement pour
faciliter la conversion entre Unicode et les anciens standards (tel
que ISO 8859). De manière générale, la méthode par combinaison est
plus extensible. Pour faciliter la conversion entre les différentes
manières de composer un caractère, plusieurs I<formes de
normalisation> sont définies dans le but de standardiser les
représentations.
Pour des raisons de compatibilité avec les anciens systèmes de codage,
l'idée "un numéro unique pour chaque caractère" est un peu remise en
S<cause :> en fait, il y a "au moins un numéro pour chaque
caractère". Un même caractère peut être représenté différemment dans
plusieurs anciens systèmes d'encodage. De même certains points de code
ne correspondent à aucun caractère. En effet, d'une part, des blocs
déjà utilisés contiennent des points de code non alloués. Et d'autre
part, dans Unicode, on trouve des caractères de contrôle (ou de
commande) et des caractères spéciaux qui ne représentent pas de vrais
caractères.
Un mythe courant concernant Unicode est que celui-ci serait S<"16
bits"> car il n'existe que C<0x10000> (ou 65536) caractères entre
C<0x0000> et C<0xFFFF>. B<Ceci est faux.> Depuis Unicode 2.0 (juillet
1996), Unicode utilise 21 bits (C<0x10FFFF>) et depuis Unicode 3.1
(mars 2001), des caractères ont été définis au-delà de C<0xFFFF>. Les
C<0x10000> premiers caractères sont appellés I<plan 0>, ou encore
I<plan multilingue de base> (PMP -- ou BMP en anglais). Avec Unicode
3.1, c'est 17 (oui, dix-sept) plans qui ont été définis mais ils ne
sont pas tous entièrement remplis, du moins pour le moment.
Un autre mythe est qu'il existerait une corrélation entre les langues
et les blocs de 256 caractères, chaque bloc définissant les caractères
utilisés par une langue ou un ensemble de langues. B<Ceci est tout
aussi faux.> Cette division en bloc existe, mais elle est presque
totalement accidentelle, un simple artéfact de la manière dont les
caractères ont été et continuent à être alloués. En revanche, il
existe le concept d'I<écriture> (ou script en anglais) qui est plus
S<utile :> il existe une écriture C<latine>, une C<grecque> et ainsi
de suite. Les écritures sont généralement réparties sur plusieurs
blocs. Pour plus d'information consultez L<Unicode::UCD>.
Les point de code Unicode ne sont que des nombres abstraits. Pour
recevoir ou émettre ces nombres abstraits, ils faut les I<encoder> ou
les I<sérialiser> d'une manière ou d'une autre. Unicode définit
plusieurs I<formes d'encodage>, parmi lesquelles I<UTF-8> est
peut-être la plus populaire. UTF-8 est méthode d'encodage à taille
variable qui encode les caractères Unicode sur 1 à 6 octets (maximum 4
pour les caractères actuellement définis). Les autres méthodes
incluent UTF-16, UTF-32 et leur variantes grand-boutistes et
petit-boutistes (UTF-8 est indépendant de l'ordre des octets).
L'ISO/IEC définit aussi les formes UCS-2 et UCS-4.
Pour plus d'information à propos de l'encodage, par exemple pour
savoir à quoi correspondent les caractères de substitution
(I<surrogates>) et les I<marques d'ordre d'octets> (I<byte order
marks> ou BOMs), consultez L<perlunicode>.
=head2 Le support d'Unicode en Perl
À partir de la version 5.6.0, Perl était apte à gérer Unicode
nativement. Mais la version 5.8.0 a été la première version
recommandée pour pouvoir travailler sérieusement avec Unicode. La
version de maintenance 5.6.1 a corrigé un grand nombre des problèmes
de l'implémentation initiale, mais par exemple, les expressions
rationnelles ne fonctionnaient toujours pas en Unicode dans la version
5.6.1.
B<À partir de Perl 5.8.0, l'utilisation de C<use utf8> n'est plus
nécessaire.> Dans les versions précédentes le pragma C<utf8> était
utilisé pour déclarer que les opérations du bloc ou du fichier courant
étaient compatibles Unicode. Ce modèle s'avéra mauvais, ou tout du
moins S<maladroit :> la caractéristique "Unicode" est maintenant liée
aux données et non plus aux opérations. L'utilisation de C<use utf8>
ne reste nécessaire que dans un seul S<cas :> lorsque le script Perl
est lui-même encodé en UTF-8. Cele vous permet alors d'utiliser
l'UTF-8 pour vos identifiants ainsi que dans les chaînes de caractères
et les expressions rationnelles. Ceci n'est pas le règlage par défaut,
car sinon les scripts comportant des données encodées en 8 bits
risqueraient de ne plus fonctionner. Consultez L<utf8>.
=head2 Le modèle Unicode de Perl
Perl supporte aussi bien les chaînes de caractères utilisant
l'encodage pré-5.6 sur huit bits natifs que celles utilisant des
caractères Unicode. Le principe est que Perl essaye au maximum de
conserver les données avec l'encodage 8 bits, mais dès que Unicode
devient indispensable, les données sont converties en Unicode de
manière transparente.
En interne, Perl utilise le jeu de caractères natif sur 8 bit de la
plateforme (par exemple Latin-1) et pour encoder les chaines de
caractères Unicode, il utilise par défaut UTF-8. Plus précisement, si
tous les points de codes d'une chaîne sont inférieurs ou égal à
C<0xFF>, Perl utilisera l'encodage sur 8 bits natif. Sinon, il
utilisera UTF-8.
En général, l'utilisateur de Perl n'a besoin ni de savoir ni de se
préoccuper de la manière dont Perl encode ses chaînes de caractères en
interne, mais cela peut devenir utile lorsqu'on envoie des chaînes
Unicode dans un flux n'utilisant pas PerlIO (il utilisera donc
l'encodage par "défaut"). Dans ce cas, les octets bruts utilisés en
interne (reposant sur le jeu de caractères natif ou sur UTF-8, selon
les chaînes) seront transmis et un avertissement "Wide character" sera
émis pour les chaînes contenant un caractère dépassant 0x00FF.
Par exemple,
perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'
produit un mélange plutôt inutile de caractères natifs et d'UTF-8
ainsi que S<l'avertissement :>
Wide character in print at ...
Pour afficher de l'UTF-8, il faut utiliser la couche C<:utf8>. L'ajout
S<de :>
( run in 1.455 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )