Chaînes de caractères multi-octets

Manuel PHP
Précédent |  | Suivant

# LIII. 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 utiliser 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`

Précédent | Sommaire | Suivant
tanh | Niveau supérieur | mb_convert_encoding