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

 
:









Les jeux de caractères qui ne fonctionnent pas comme encodage interne à PHP , peuvent toutefois être utilisé avec les fonctions de conversion de mbstring .

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 .

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 .

  • Active les fonctions mbstring . Cette option est nécessaire pour utiliser les fonctions mbstring .

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

    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 .

 
?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( ) .

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

 
:













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 :

  • Japanais / coréen / Chinois



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