LII. Chaînes de caractères multi-octets

Introduction

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 :

Exemple 1. Jeu de caractères qui fonctionnent avec PHP

Jeus de caractères qui fonctionnent avec PHP :
ISO-8859-*, EUC-JP, UTF-8

Jeu de caractères qui NE fonctionnent PAS avec PHP :
JIS, SJIS

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.

Installation

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.

Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Tableau 1. Options de configuration

NomPar défautModifiable
mbstring.languageNULLPHP_INI_ALL
mbstring.detect_orderNULLPHP_INI_ALL
mbstring.http_inputNULLPHP_INI_ALL
mbstring.http_outputNULLPHP_INI_ALL
mbstring.internal_encodingNULLPHP_INI_ALL
mbstring.script_encodingNULLPHP_INI_ALL
mbstring.substitute_characterNULLPHP_INI_ALL
mbstring.func_overload"0"PHP_INI_SYSTEM
mbstring.encoding_translation"0"PHP_INI_ALL
Pour plus de détails sur les constantes PHP_INI_*, reportez-vous à ini_set().

Voici un éclaircissement sur l'utilisation des directives de configuration.

mbstring.language string

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

mbstring.encoding_translation string

Active la détection et la traduction des données d'entrées HTTP vers le codage interne mbstring.

mbstring.internal_encoding string

Définit l'encodage interne par défaut.

mbstring.http_input string

Définit l'encodage de reception HTTP par défaut.

mbstring.http_output string

Définit l'encodage d'affichage HTTP par défaut.

mbstring.detect_order string

Définit l'ordre de détection des encodages par défaut. Voir aussi mb_detect_order().

mbstring.substitute_character string

Définit l'encodage de substitution par défaut : il est utilisé pour les caractères invalides.

mbstring.func_overload string

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 2. Configuration de php.ini pour mbstring

; Langage par défaut
mbstring.language        = English; Anglais (par défaut)
mbstring.language        = Japanese; Japonais

;; Jeu de caractère interne
;; Note : Assurez vous que ce jeu fonctionne avec PHP
mbstring.internal_encoding    = UTF-8 

;; Activation de la conversion automatique des entrées HTTP
mbstring.encoding_translation = On

;; Jeu de caractères par défaut pour les données d'entrée HTTP
;; Note : Le script ne peux pas changer cette configuration
mbstring.http_input           = pass    ; Aucune conversion. 
mbstring.http_input           = auto    ; Utilise auto
                                ; "auto" est remplacé par "ASCII,JIS,UTF-8,EUC-JP,SJIS"
mbstring.http_input           = SJIS    ; Utilise SJIS
mbstring.http_input           = UTF-8,SJIS,EUC-JP ; Specifie l'ordre

;;Jeu de caractères par défaut pour les données de sortie HTTP
mbstring.http_output          = pass    ; Aucune conversion
mbstring.http_output          = UTF-8   ; Utilise UTF-8

;; Ordre de détection des jeux de caractères
mbstring.detect_order         = auto    ; Utilise la détection automatique
mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Spécifie l'ordre

;; Set default substitute character
mbstring.substitute_character = 12307   ; Spécifie une valeur Unicode
mbstring.substitute_character = none    ; Ne pas afficher de caractères
mbstring.substitute_character = long    ; Exemple complet : U+3000,JIS+7E7E

Exemple 3. Configuration de php.ini pour les utilisateurs de EUC-JP

;; Désactive la bufferisation de sortie
output_buffering      = Off

;; Choisi le jeu de caractères
default_charset       = EUC-JP    

;; Le langage par défaut est le japonais
mbstring.language = Japanese

;; Activation de la traduction automatique des données d'entrée HTTP
mbstring.encoding_translation = On

;; Acitvation de la converstion automatique
mbstring.http_input   = auto 

;; Convertit les sorties en EUC-JP
mbstring.http_output  = EUC-JP    

;; Utilise le jeu de caractères interne EUC-JP
mbstring.internal_encoding = EUC-JP    

;; Ne pas afficher les caractères invalides
mbstring.substitute_character = none

Exemple 4. Configuration de php.ini pour les utilisateurs de SJIS

;; Active la bufferisation de sortie
output_buffering     = On

;; Utilise le gestionnaire mb_output_handler pour la conversion de sortie
output_handler       = mb_output_handler

;; Choisi le jeu de caractères
default_charset      = Shift_JIS

;; Le langage par défaut est le japonais
mbstring.language = Japanese

;; Activation de la traduction automatique des données d'entrée HTTP
mbstring.http_input  = auto 

;; Convertit en SJIS
mbstring.http_output = SJIS    

;;Utilise le jeu de caractères interne EUC-JP
mbstring.internal_encoding = EUC-JP    

;; Ne pas afficher les caractères invalides
mbstring.substitute_character = none

Types de ressources

Cette extension ne définit aucune ressource.

Constantes prédefinies

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.

MB_OVERLOAD_MAIL (entier)

MB_OVERLOAD_STRING (entier)

MB_OVERLOAD_REGEX (entier)

Entrées/Sorties HTTP

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.

    Exemple 5. Désactive la conversion HTTP dans le php.ini

    ;; Désactive la conversion HTTP
    mbstring.http_input = pass
    ;; Désactive la conversion HTTP (PHP 4.3.0 ou plus récent)
    mbstring.encoding_translation = Off

    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 6. Exemple de configuration de mbstring dans php.ini

;; Active la conversion de sortie pour toute les pages PHP

;; Active la bufferisation de sortie
output_buffering    = On

;; Choisi mb_output_handler pour effectuer la conversion de sortie
output_handler      = mb_output_handler

Exemple 7. Exemple de script avec mbstring

<?php

// Active la conversion de caract&egrave;re uniquement pour cette page

// Choisi le jeu de caract&egrave;res SJIS
mb_http_output('SJIS');

// Commence la bufferisation et sp&eacute;cifie "mb_output_handler"
// comme fonction de callback
ob_start('mb_output_handler');
?>

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-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.

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 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.

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é. 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.

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

    http://www.unicode.org/

  • Japonais/coréen/Chinois

    ftp://ftp.ora.com/pub/examples/nutshell/ujip/doc/cjk.inf

Table des matières
mb_convert_case -- Modifie la casse d'une chaîne
mb_convert_encoding -- Conversion d'encodage
mb_convert_kana --  Convertit entre les différents "kana"
mb_convert_variables -- Convertit l'encodage de variables
mb_decode_mimeheader -- Décode une en-tête MIME
mb_decode_numericentity --  Décode les entités HTML en caractères
mb_detect_encoding -- Détecte un encodage
mb_detect_order --  Lit/modifie l'ordre de détection des encodages
mb_encode_mimeheader -- Encode une chaîne pour une en-tête MIME
mb_encode_numericentity --  Encode des entités HTML
mb_ereg_match --  Expression régulière POSIX pour les chaînes multi-octets
mb_ereg_replace -- Remplace des segments de chaînes, avec le support des expressions régulières mutli-octet
mb_ereg_search_getpos --  Retourne l'offset du début du prochain segment repéré par une expression régulière
mb_ereg_search_getregs --  Lit le dernier segment de chaîne multi-octets qui correspond au masque
mb_ereg_search_init --  Configure les chaînes et les expressions régulières pour le support des caractères multi-octets
mb_ereg_search_pos --  Retourne la position et la longueur du segement de chaîne qui vérifie le masque de l'expression régulière
mb_ereg_search_regs --  Retourne le segment de chaîne trouvé par une expression régulière multi-octets
mb_ereg_search_setpos -- Choisit le point de départ de la recherche par expression régulière
mb_ereg_search --  Recherche par expression régulière multi-octets
mb_ereg -- Recherche par expression régulière avec support des caractères multi-octets
mb_eregi_replace --  Expression régulière avec support des caractères multi-octets, sans tenir compte de la casse
mb_eregi --  Regular expression match ignoring case with multibyte support
mb_get_info -- Lit la configuration interne de l'extension mbstring
mb_http_input -- Détecte le type d'encodage d'un caractère HTTP
mb_http_output -- Lit/modifie l'encodage d'affichage
mb_internal_encoding --  Lit/modifie l'encodage interne
mb_language -- Lit/modifie le langage courant
mb_output_handler --  Fonction de traitement des affichages web
mb_parse_str --  Analyse les données HTTP GET/POST/COOKIE et assigne les variables globales
mb_preferred_mime_name -- Détecte l'encodage MIME
mb_regex_encoding --  Retourne le jeu de caractères courant pour les expressions régulières
mb_regex_set_options --  Lit et modifie les options des fonctions d'expression régulières à support de caractères multi-octets
mb_send_mail --  Envoie un mail encodé ISO-2022-JP (mail japonais)
mb_split -- Scinde une chaîne en tableau avec une expression régulière multi-octets
mb_strcut -- Coupe une partie de chaîne
mb_strimwidth -- Tronque une chaîne
mb_strlen -- Retourne la taille d'une chaîne
mb_strpos --  Repère la première occurence d'un caractère dans une chaîne
mb_strrpos --  Repère la dernière occurence d'un caractère dans une chaîne
mb_strtolower -- Met tous les caractères en minuscules
mb_strtoupper -- Met tous les caractères en majuscules
mb_strwidth -- Retourne la largeur d'une chaîne
mb_substitute_character -- Lit/modifie les caractères de substitution
mb_substr_count -- Compte le nombre d'occurrences d'une sous-chaîne
mb_substr -- Lit une sous-chaîne