De nombreuses langues dont les signes ne peuvent pas être exprimés sur un seul octet. Des codes multi-octets sont utilisés pour pallier à cette insuffisance. mbstring est développé pour supporter les caractères japonais. Cependant, de nombreuses fonctions mbstring peuvent supporter d'autres jeux de caractères.
Les jeux de caractères multi-octets représentent les caractères sur plusieurs octets consécutifs (d'où leur nom). Certains systèmes d'encodages ont des caractères d'échappement dédiés, pour démarrer/finir une séquence de caractères multi-octets. De ce fait, certains caractères peuvent être détruit lorsqu'une chaîne est coupée en plusieurs morceaux, ou bien conduire à des résultats erronnés lorsque le nombre de caractère est compté. Il faut utiliser des fonctions qui supportent ces encodages. Les fonctions mbstring supportent les jeux de caractères multi-octets, ainsi que les conversions.
Etant donné que PHP supporte essentiellement le jeu de caractères ISO-8859-1, certains jeux de caractères ne fonctionnent pas bien avec PHP. Par conséquent, il est important de donner une valeur à l'option de configuration mbstring.internal_encoding qui permettent à PHP de travailler correctement.
Pré-requis PHP 4
Encodage par octet
Les caractères d'un octet dans l'intervalle 00h-7fh doivent être compatibles avec le code ASCII
Jeux de caractères multi-octets, qui n'utilisent pas l'intervalle 00h-7fh.
Voici des exemples d'encodage internes :
Les jeux de caractères qui ne fonctionnent pas comme encodage interne à PHP, peuvent toutefois être utilisé avec les fonctions de conversion de mbstring.
Note : SJIS ne doit pas être utilisé comme encodage interne, à moins que vous ne soyez familier de l'analyseur/compilateur, et des problèmes liés aux jeux de caractères.
Note : SI vous utilisez une base de données avec PHP, il est recommandé que vous utilisiez le même jeu de caractère pour la base de données et le jeu de caractère interne de PHP, pour améliorer les performances.
Si vous utilisez PostgreSQL, il supporte des jeux de caractères qui peuvent être différents de ceux du client. Reportez vous au manuel de PostgreSQL pour plus de détails.
mbstring est un module PHP. Vous devez activer le module avec le script de configuration configure. Reportez vous à la section installation pour plus de détails.
Les options de configurations suivantes sont liées au module mbstring.
--enable-mbstring : Active les fonctions mbstring. Cette option est nécessaire pour utiliser les fonctions mbstring.
Note : A partir de PHP 4.3.0, l'option --enable-mbstring sera activée par défaut, et remplacée par --with-mbstring[=LANG] pour supporter le chinois, coréen et russe. Le jeu de caractères japonais est supporté par défaut. Si --with-mbstring=cn est utilisé, le chinois simplifié sera supporté. Si --with-mbstring=tw est utilisé, le chinois traditionnel sera supporté. Si --with-mbstring=kr est utilisé, le coréen sera supporté. Si --with-mbstring=ru est utilisé, le russe sera supporté. Si --with-mbstring=all est utilisé, toutes les langues ci-dessus seront configurée, mais la taille de PHP sera maximisée, à cause des tables de conversions pour l'Unicode. Notez que le chinois, coréen et russe sont expérimentelement supportés en PHP 4.3.0.
--enable-mbstr-enc-trans : Active la conversion automatique des données par HTTP, avec le moteur de conversion de mbstring. Si cette option est activée, les données venants du web via HTTP seront converties dans le jeu de caractères mbstring.internal_encoding, automatiquement. automatically.
Note : Depuis PHP 4.3.0, l'option --enable-mbstr-enc-trans sera éliminée, et remplacée par mbstring.encoding_translation. La conversion de jeu de caractères d'entrée HTTP sera activée lorsque cette option sera à On (Par défaut, cette option vautOff).
--enable-mbregex : Active les fonctions d'expressions régulières, compatibles avec les caractères multi-octets.
Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.
Tableau 1. Options de configuration
Nom | Par défaut | Modifiable |
---|---|---|
mbstring.language | NULL | PHP_INI_ALL |
mbstring.detect_order | NULL | PHP_INI_ALL |
mbstring.http_input | NULL | PHP_INI_ALL |
mbstring.http_output | NULL | PHP_INI_ALL |
mbstring.internal_encoding | NULL | PHP_INI_ALL |
mbstring.script_encoding | NULL | PHP_INI_ALL |
mbstring.substitute_character | NULL | PHP_INI_ALL |
mbstring.func_overload | "0" | PHP_INI_SYSTEM |
mbstring.encoding_translation | "0" | PHP_INI_ALL |
Voici un éclaircissement sur l'utilisation des directives de configuration.
Définit le langage utilisé par mbstring. Notez que cette option définit mbstring.internal_encoding mbstring.internal_encoding doit être placé après mbstring.language dans le fichier php.ini
Active la détection et la traduction des données d'entrées HTTP vers le codage interne mbstring.
Définit l'encodage interne par défaut.
Définit l'encodage de reception HTTP par défaut.
Définit l'encodage d'affichage HTTP par défaut.
Définit l'ordre de détection des encodages par défaut. Voir aussi mb_detect_order().
Définit l'encodage de substitution par défaut : il est utilisé pour les caractères invalides.
Remplace les fonctions de traitement des chaînes par les fonctions mbstring. mail(), ereg(), etc... sont remplacées par mb_send_mail(), mb_ereg(), etc... Les valeurs possibles sont 0, 1, 2, 4 ou toute combinaison des quatres. Par exemple, 7 remplacera tout : 0: Aucun remplacement, 1: Remplace mail(), 2: Remplace les fonctions str*(), 4: Remplace les fonctions ereg*().
Les navigateurs sont supposés utiliser le même jeu de caractères lorsqu'ils soumettent un formulaire. Mais, tous les navigateurs ne le font pas. Reportez vous à la fonction mb_http_input() pour détecter les jeux de caractères utilisé par les navigateurs.
Si enctype est mis à multipart/form-data dans les formulaires HTML, mbstring ne convertira pas les données de POST. L'utilisateur doit les convertir dans le script, si nécessaire.
En général, les navigateurs sont suffisament intelligent pour détecter les jeux de caractères dans le HTML. Si charset est activé dans les en-têtes, cela donnera de meilleurs résultats. Changez la valeur de default_charset avec la valeur appropriée.
Exemple 3. Configuration de php.ini pour les utilisateurs de EUC-JP
|
Exemple 4. Configuration de php.ini pour les utilisateurs de SJIS
|
Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.
La conversion automatiques des entrées/sorties HTTP peuvent aussi convertir des données binaires. Les utilisateurs doivent contrôler les conversions, si des données binaires doivent être utilisées via HTTP.
Si l'option enctype d'un formulaire HTML vaut multipart/form-data, mbstring ne convertira pas les données du POST. Dans ce cas, les chaînes de caractères doivent être convertis manuellement.
Entrée HTTP
Il n'y a pas de moyen 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.
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.
Note : 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 7. Exemple de script avec mbstring
|
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-4, UCS-4BE, UCS-4LE, UCS-2, UCS-2BE, UCS-2LE, UTF-32, UTF-32BE, UTF-32LE, UCS-2LE, UTF-16, UTF-16BE, UTF-16LE, UTF-8, UTF-7, ASCII, EUC-JP, SJIS, eucJP-win, SJIS-win, ISO-2022-JP, JIS, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-13, ISO-8859-14, ISO-8859-15, byte2be, byte2le, byte4be, byte4le, BASE64, 7bit, 8bit et UTF7-IMAP.
Depuis PHP 4.3.0, les jeux de caractèrs suivants sont ajoutés, mais restent expérimentaux : EUC-CN, CP936, HZ, EUC-TW, CP950, BIG-5, EUC-KR, UHC (CP949), ISO-2022-KR, Windows-1251 (CP1251), Windows-1252 (CP1252), CP866 et KOI8-R.
Les entrées du fichiers 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 utilisée, elle est remplacée par "ASCII,JIS,UTF-8,EUC-JP,SJIS".
Voir aussi mb_detect_order().
Note : Un jeu de caractère supporté n'est pas forcément un bon choix comme jeu de caractères interne.
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 par exemple 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 par exemple 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 régulières. 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.
Tableau 2. Fonctions de remplacement
Valeur de mbstring.func_overload | Fonction originale | Fonction de remplacement |
---|---|---|
1 | mail() | mb_send_mail() |
2 | strlen() | mb_strlen() |
2 | strpos() | mb_strpos() |
2 | strrpos() | mb_strrpos() |
2 | substr() | mb_substr() |
4 | ereg() | mb_ereg() |
4 | eregi() | mb_eregi() |
4 | ereg_replace() | mb_ereg_replace() |
4 | eregi_replace() | mb_eregi_replace() |
4 | split() | mb_split() |
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é. 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 encodage de caractères définissent des séquences de début/fin pour les sections multi-octets.
Les bases de données allouent des tailles de stockages différentes de celles utilisées par PHP, même si le même encodage de caractère est utilisé (par exemple, PostGreSQL).
Le courrier électronique utilise généralement ISO-2022-JP.
Les sites web en "i-mode" utilisent Shift_JIS.
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
Japonais/coréen/Chinois
ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf
Précédent | Sommaire | Suivant |
tanh | Niveau supérieur | mb_convert_case |