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
de chaînes qui vous permet de travailler avec les encodages multi-octets en &php;.
En plus de cela, mbstring gère la traduction
entre les jeux de caractères disponibles. mbstring est
également connu pour gérer l'Unicode, comme UTF-8 et UCS-2 ainsi que de
nombreux autres jeux mono-octets.
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 caractères 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 vous connectez à une base de données avec &php;, il est recommandé
d'utiliser le même jeu de caractères pour la base de données et pour le
jeu interne pour améliorer le confort d'utilisation
mais aussi 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
Toutes les entrées du &php.ini; qui acceptent un nom d'encodage
peuvent également utiliser les valeurs "auto"
et "pass".
Les fonctions mbstring, qui acceptent des
noms de jeux de caractères, peuvent également utiliser 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;
Vous pourriez trouver difficile de faire fonctionner une application &php;
existante dans un environnement multi-octets. Ceci est dû au fait
que la plupart des applications &php; sont écrites avec des fonctions
de chaînes de caractères standards comme la fonction
substr, qui est connue pour ne pas gérer
proprement les chaînes multi-octets.
Mbstring supporte aussi la surcharge de fonctions, pour
permettre le support des chaînes multi-octets sans modifier les
scripts &php;. En utilisant ce système de surcharge de fonctions,
certaines 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.
Pour utiliser la surcharge de fonctions, définissez
mbstring.func_overload, dans le &php.ini;,
à une valeur positive qui représente une combinaison de masques d'octets
spécifiant les catégories de fonctions à surcharger. Il doit être définit à
1 pour surcharger la fonction mail, 2 pour les
fonction de chaînes, 4 pour les fonctions d'expression rationnelles.
Par exemple, avec la valeur 7, toutes les fonctions précédentes seront
surchargées. Voici la liste complète des fonctions surchargé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
Les caractères japonais ne peuvent être représentés qu'avec des encodages
multi-octets et les standards d'encodage multiple sont utilisés suivant
la plateforme et le texte de référence. Pour facilité les choses, ces standards
d'encodages diffèrent légèrement les uns des autres.
Pour développer des applications Web en environnement
japonais, le développeur devra garder à l'esprit ces complexités afin de s'assurer
que l'encodage de caractères correct est utilisé.
La taille nécessaire à un caractère peut aller jusqu'à 4 octets.
Un caractère japonais multi-octets occupe généralement deux octets,
à comparer avec les caractères simple-octet traditionnellement
utilisés. Ces caractères sont appelés "zen-kaku", ce qui signifie
"grande largeur". Les plus petits sont appelés "han-kaku",
ce qui signifie "demi-largeur".
Certains encodages de caractères utilisent des séquences "shift" (escape)
définies dans la référence ISO-2022 pour basculer vers la carte d'encodage du code
spécifique (00h to 7fh).
ISO-2022-JP doit être utilisé pour les protocoles SMTP/NNTP, et les en-têtes ainsi
que les entités devraient être réencodés en accord avec la RFC correspondante.
Bien que cela ne soit pas requis, ça 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 et ne
peuvent être traités totalement dans cette documentation. Reportez-vous aux
URL suivantes pour d'autres ressources complémentaires :
Unicode/UTF/UCS/etc
&url.unicode;
Japonais/coréen/Chinois
&url.oreilly.cjk-inf;
&reference.mbstring.encodings;
&reference.mbstring.functions;