Chaînes de caractères multi-octetsChaînes de caractères multi-octets
&reftitle.intro;
Même si la plupart des langues peuvent être représentées grâce
à un jeu de 128 caractères, il y a d'autres langues qui requièrent
des jeux de caractères bien plus grands. Des méthodes de caractères
multi-octets ont été développées pour résoudre ce type de problème.
Lorsque vous manipulez des chaînes de caractères multi-octets,
pour couper, rechercher ou nettoyer une chaîne, vous devez utiliser deux
octets consécutifs, qui représentent un seul caractère. Si vous n'y prenez
pas garde, vous allez obtenir une chaîne corrompue et invalide, avec
une représentation totalement incompréhensible.
mbstring fournit les fonctions spécifiques de manipulations
des chaînes multi-octets pour &php;, qui ne supporte que les jeux
mono-octets. De plus, mbstring gère la traduction
entre les jeux de caractères disponibles.
mbstring est aussi connu pour gérer l'Unicode, comme
UTF-8 et UCS-2 ainsi que de nombreux autres jeux mono-octets, même si
mbstring a été conçu à la base pour les pages
web japonaises.
Pré-requis de l'encodage en &php;
Les jeux de caractères suivants sont bien supportés par &php;.
Jeux de caractères mono-octets :
qui sont compatibles avec la norme ASCII (compatible ISO646)
pour les caractères de l'intervalle 00h à
7fh.
Jeux de caracètres multi-octets :
qui sont compatibles avec la norme ASCII (compatible ISO646)
pour les caractères de l'intervalle 00h à
7fh.
qui n'utilisent pas les séquences de type ISO2022.
qui n'utilisent pas de valeur dans l'intervalle 00h à
7fh dans les séquences composées, qui
représentent un caractère unique.
Les jeux de caractères suivants risquent de ne pas fonctionner en &php;.
Jeux de caractères qui risquent de ne pas fonctionner en &php;
Même si aucun script &php; écrit avec ces jeux de caractères ne fonctionne,
notamment si des chaînes encodées sont utilisées comme identifiants,
ou valeurs littérales dans le script, vous pouvez éviter d'utiliser ces
jeux en activant le filtre transparent mbstring pour les
données d'entrées HTTP.
Il est déconseillé d'utiliser les jeux SJIS, BIG5, CP936, CP949 et
GB18030 pour l'encodage interne, à moins que vous ne soyez très familiers
avec l'analyseur, le scanneur et le jeu de caractère lui-même.
Si vous avez une base de données connectée à &php;, il est recommandé
d'utiliser le même jeu de caractères dans la base et comme
jeu interne pour améliorer le confort d'utilisation
et les performances.
Si vous utilisez PostgreSQL, le jeu de caractères utilisé dans la base
de données et celui de &php; peuvent différer car cette base supporte
la traduction automatique de jeu de caractères.
&reference.mbstring.configure;
&reference.mbstring.ini;
&reftitle.resources;
&no.resource;
&reference.mbstring.constants;
Entrées/Sorties HTTP
La conversion automatique des entrées/sorties HTTP peut
aussi convertir des données binaires. Les utilisateurs
doivent contrôler les conversions, si des données binaires doivent
être utilisées via HTTP.
Depuis la version 4.3.2 de &php;, il y a une limitation dans
l'utilisation des fonctionnalités mbstring :
l'encodage ne sera pas effectué dans les données transmises en méthode
POST si l'attribut enctype de la balise
form vaut multipart/form-data.
Donc, vous devrez convertir les données entrantes vous-même dans ce cas,
si nécessaire.
Depuis la version 4.3.3 de &php;, si l'attribut
enctype de la balise form vaut
multipart/form-data et que la directive du
&php.ini; est positionnée à On, les variables et les noms de fichiers
téléchargés en méthode POST seront convertis avec l'encodage interne.
Sinon, la conversion ne sera pas faite.
Entrée HTTP
Il n'y a pas de moyens de contrôler la conversion des caractères
HTTP en entrée, depuis un script &php;. Pour désactiver cette
conversion, il faut le faire dès le fichier &php.ini;.
Désactive la conversion HTTP dans le php.ini
Lorsque vous utilisez &php; comme module Apache, il est possible
d'annuler la configuration du &php.ini; pour
chaque Virtual Host dans le fichier
&httpd.conf; ou par dossier avec le fichier
.htaccess. Reportez-vous à la section de
configuration ainsi qu'au
manuel Apache.
Sorties HTTP
Il y a plusieurs moyens d'activer la conversion en sortie de script
&php;. L'un d'entre eux utilise &php.ini;, un autre
utilise ob_start avec la fonction
mb_output_handler comme fonction de call-back.
Pour les utilisateurs PHP3-i18n, le système de conversion de
mbstring diffère de celui de PHP3-i18n.
Le jeu de caractère est converti avec un buffer de sortie.
Exemple de configuration de mbstring dans &php.ini;Exemple de script avec mbstring
]]>
Jeux de caractères supportés
Actuellement, les jeux de caractères suivants sont
supportés par mbstring. L'encodage
de caractère peut être spécifié
par les paramètres encoding dans les fonctions
mbstring.
Les jeux de caractères suivants sont supportés par
mbstring :
UCS-4UCS-4BEUCS-4LEUCS-2UCS-2BEUCS-2LEUTF-32UTF-32BEUTF-32LEUTF-16UTF-16BEUTF-16LEUTF-7UTF7-IMAPUTF-8ASCIIEUC-JPSJISeucJP-winSJIS-winISO-2022-JPJISISO-8859-1ISO-8859-2ISO-8859-3ISO-8859-4ISO-8859-5ISO-8859-6ISO-8859-7ISO-8859-8ISO-8859-9ISO-8859-10ISO-8859-13ISO-8859-14ISO-8859-15byte2bebyte2lebyte4bebyte4leBASE64HTML-ENTITIES7bit8bitEUC-CNCP936HZEUC-TWCP950BIG-5EUC-KRUHC (CP949)ISO-2022-KRWindows-1251 (CP1251)Windows-1252 (CP1252)CP866 (IBM866)KOI8-R
Les entrées du fichier &php.ini;, qui acceptent des
noms de jeux de caractères, acceptent aussi les valeurs
"auto" et
"pass".
Les fonctions mbstring, qui acceptent des
noms de jeux de caractères, acceptent aussi la valeur
"auto".
Si "pass" est utilisée, aucune conversion
n'est effectuée.
Si "auto" est défini, la liste sera étendue à la liste des encodages
définis par NLS.
Par exemple, si NLS vaut Japanese, les valeurs seront
"ASCII,JIS,UTF-8,EUC-JP,SJIS".
Voir aussi mb_detect_order.
Exploitation des chaînes multi-octets en &php;
Comme presque tout &php; est écrit pour des langues qui sont
simple octets, il y a des difficultés à gérer le japonais. Toutes
les fonctions &php; de gestion des chaînes de caractères, comme
substr ne supportent par
les chaînes multi-octets.
L'extension Multibyte (multi-octets, alias mbstring) dispose de fonctions
de chaînes, qui supportent le multi-octet, comme
mb_substr, qui est un remplaçant de substr.
mbstring supporte aussi le remplacement de fonction, pour
permettre le support des chaînes multi-octets sans modifier les
scripts &php;. En utilisant ce système de remplacement de fonctions,
certains fonctions &php; seront remplacées par leur équivalent
de mbstring. Par exemple mb_substr remplacera
substr. Ce système de remplacement transparent,
permet un portage simple et efficace des applications.
mbstring.func_overload, dans le &php.ini;,
doit être configuré avec une valeur positive :
1 remplace la fonction d'envoi de mail ; 2 active les
fonction de chaînes ; 4 active les fonctions d'expression rationnelles.
Par exemple, avec la valeur 7, toutes les fonctions possibles sont
remplacées. Voici la liste complète des fonctions remplacées, avec
leur fonction de remplacement.
Fonctions de remplacementValeur de mbstring.func_overloadFonction originaleFonction de remplacement1mailmb_send_mail2strlenmb_strlen2strposmb_strpos2strrposmb_strrpos2substrmb_substr2strtolowermb_strtolower2strtouppermb_strtoupper2substr_countmb_substr_count4eregmb_ereg4eregimb_eregi4ereg_replacemb_ereg_replace4eregi_replacemb_eregi_replace4splitmb_split
Il n'est pas recommandé d'utiliser les options des fonctions d'overloading
dans un contexte de per-directory, car il n'est pas
confirmé encore qu'elles sont suffisamment stables dans un environnement
de production et peuvent conduire à un résultat incohérent.
Cas des caractères japonais
La plupart des caractères japonais demandent plus d'un octet
pour être représentés. De plus, plusieurs jeux de caractères
japonais existent : il y a notamment EUC-JP, Shift_JIS et
ISO-2022-JP. Unicode devient de plus en plus populaire, et
UTF-8 aussi. Pour développer des applications Web en environnement
japonais, il faut savoir que les encodages ci-dessus dépendent de
l'application qu'on en fait : entrée/sortie HTTP, bases de données
ou courrier électronique.
La taille nécessaire à un caractère peut aller jusqu'à 4 octets.
Un caractère multi-octets occupe généralement deux octets,
à comparer avec les caractères simple-octet traditionnellement
utilisés. Les caractères les plus gros sont appelés "zen-kaku"
(i.e. grande largeur) et les plus petits sont appelés "han-kaku"
(i.e. demi-largeur). Les caractères "zen-kaku" sont
généralement de taille constante.
Certains encodages de caractères définissent des séquences de
début/fin pour les sections multi-octets
(00h to 7fh).
ISO-2022-JP doit être utilisé pour les protocoles SMTP/NNTP, et les en-têtes ainsi
que les entitiés devraient être réencodés en accord avec la RFC correspondante.
Bien que cela ne soit pas requis, ca reste une bonne idée car beaucoup de
user-agent (agents utilisateurs) populaires ne peuvent pas reconnaître d'autre
méthode d'encodage.
Les pages Web créées pour les téléphones portables comme
i-mode,
Vodafone live!, ou EZweb
sont supposées utiliser l'encodage Shift_JIS.
Références
Les jeux de caractères multi-octets et leurs techniques sont très complexes.
Il n'est pas possible de couvrir tous les aspects en détails ici. Reportez-vous aux
URL suivantes pour d'autres ressouces complémentaires :
Unicode/UTF/UCS/etc
&url.unicode;
Japonais/coréen/Chinois
&url.oreilly.cjk-inf;
&reference.mbstring.encodings;
&reference.mbstring.functions;