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

Avertissement

Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utilisez ce module à vos risques et périls.

Introduction

Avertissement

Ce module est expérimental. Les noms des fonctions sont sujets à des changaments probables. Actuellement, les conversions ne supportent que le Japonais.

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 :

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

Comment activer mbstring

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.

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

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 1. Inactive la conversion HTTP dans le php.ini

    ;; Inactive la conversion HTTP
    mbstring.http_input = pass

    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 2. 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 3. Script example

<?php
// Active la conversion de caractère uniquement pour cette page
// Choisi le jeu de caractères SJIS
mb_http_output('SJIS');
// Commence la bufferisation et spé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.

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.

Configuration php.ini

  • mbstring.internal_encoding définit le jeu de caractères interne par défaut.

  • mbstring.http_input définit le jeu de caractères d'entrée HTTP par défaut.

  • mbstring.http_output defines définit le jeu de caractères d'affichage HTTP par défaut.

  • mbstring.detect_order définit l'ordre de détection des jeux de caractères (lors de la lecture sur une source externe. Voir aussi la fonction mb_detect_order().

  • mbstring.substitute_character définit le caractère de substitution pour les codes invalides.

Les navigateurs web utilisent tout le temps le même encodage lorsqu'ils émettent les données d'un formulaire. Cependant, les navigateurs peuvent ne pas tous utiliser le même encodage. Voyez la fonction mb_http_input() pour détecter les jeux de caractères utilisés par les navigateurs.

Si enctype vaut multipart/form-data dans un formulaire HTML, mbstring n'effectue aucune conversion des données. Il faut les faire manuellement, dans le script.

Bien que les navigateurs soivent généralement assez intelligents pour détecter les jeux de caractères automatiquement, il est recommandé de l'indiquer dans l'en-tête charset. Modifiez default_charset en fonction du jeu de caractères.

Exemple 4. Exemple de configuration php.ini pour mbstring

;; Set default internal encoding
;; Note: Make sure to use character encoding works with PHP
mbstring.internal_encoding    = UTF-8  ; Set internal encoding to UTF-8
;; Set default HTTP input character encoding
;; Note: Script cannot change http_input setting.
mbstring.http_input           = pass    ; No conversion.
mbstring.http_input           = auto    ; Set HTTP input to auto
	                                ; "auto" is expanded to "ASCII,JIS,UTF-8,EUC-JP,SJIS"
mbstring.http_input           = SJIS    ; Set HTTP2 input to  SJIS
mbstring.http_input           = UTF-8,SJIS,EUC-JP ; Specify order
;; Set default HTTP output character encoding
mbstring.http_output          = pass    ; No conversion
mbstring.http_output          = UTF-8   ; Set HTTP output encoding to UTF-8
;; Set default character encoding detection order
mbstring.detect_order         = auto    ; Set detect order to auto
mbstring.detect_order         = ASCII,JIS,UTF-8,SJIS,EUC-JP ; Specify order
;; Set default substitute character
mbstring.substitute_character = 12307   ; Specify Unicode value
mbstring.substitute_character = none    ; Do not print character
mbstring.substitute_character = long    ; Long Example: U+3000,JIS+7E7E

Exemple 5. Exemple de configuration php.ini pour mbstring pour utiliser EUC-JP

;; Disable Output Buffering
output_buffering      = Off
;; Set HTTP header charset
default_charset       = EUC-JP
;; Set HTTP input encoding conversion to auto
mbstring.http_input   = auto
;; Convert HTTP output to EUC-JP
mbstring.http_output  = EUC-JP
;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP
;; Do not print invalid characters
mbstring.substitute_character = none

Exemple 6. Exemple de configuration php.ini pour mbstring pour utiliser SJIS

;; Enable Output Buffering
output_buffering     = On
;; Set mb_output_handler to enable output conversion
output_handler       = mb_output_handler
;; Set HTTP header charset
default_charset      = Shift_JIS
;; Set http input encoding conversion to auto
mbstring.http_input  = auto
;; Convert to SJIS
mbstring.http_output = SJIS
;; Set internal encoding to EUC-JP
mbstring.internal_encoding = EUC-JP
;; Do not print invalid characters
mbstring.substitute_character = none

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/

  • Japanais/coréen/Chinois

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

Table des matières
mb_convert_case -- Perform case folding on a string
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 --  Regular expression match for multibyte string
mb_ereg_replace -- Replace regular expression with multibyte support
mb_ereg_search_getpos --  Returns start point for next regular expression match
mb_ereg_search_getregs --  Retrive the result from the last multibyte regular expression match
mb_ereg_search_init --  Setup string and regular expression for multibyte regular expression match
mb_ereg_search_pos --  Return position and length of matched part of multibyte regular expression for predefined multibyte string
mb_ereg_search_regs --  Returns the matched part of multibyte regular expression
mb_ereg_search_setpos --  Set start point of next regular expression match
mb_ereg_search --  Multibyte regular expression match for predefined multibyte string
mb_ereg -- Regular expression match with multibyte support
mb_eregi_replace --  Replace regular expression with multibyte support ignoring case
mb_eregi --  Regular expression match ignoring case with multibyte support
mb_get_info -- Get internal settings of 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 --  Returns current encoding for multibyte regex as string
mb_regex_set_options --  Set/Get the default options for mbregex functions
mb_send_mail --  Envoie un mail encodé ISO-2022-JP (mail japonais)
mb_split -- Split multibyte string using regular expression
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 -- Make a string lowercase
mb_strtoupper -- Make a string uppercase
mb_strwidth -- Retourne la largeur d'une chaîne
mb_substitute_character -- Lit/modifie les caractères de substitution
mb_substr_count -- Count the number of substring occurrences
mb_substr -- Lit une sous-chaîne