Chaînes de caractères multi-octets Chaînes de caractères multi-octets
&reftitle.intro; Même si la plupart des langues peuvent être représentées grâce à un jeu de 128 caractères, il y a d'autres langues qui requièrent des jeux de caractères bien plus grands. Des méthodes de caractères multi-octets ont été développées pour résoudre ce type de problème. Lorsque vous manipulez des chaînes de caractères multi-octets, pour couper, rechercher ou nettoyer une chaîne, vous devez utiliser deux octets consécutifs, qui représentent un seul caractère. Si vous n'y prenez pas garde, vous allez obtenir une chaîne corrompue et invalide, avec une représentation totalement incompréhensible. mbstring fournit les fonctions spécifiques de manipulations des chaînes multi-octets pour &php;, qui ne supporte que les jeux mono-octets. De plus, mbstring gère la traduction entre les jeux de caractères disponibles. mbstring est aussi connu pour gérer l'Unicode, comme UTF-8 et UCS-2 ainsi que de nombreux autres jeux mono-octets, même si mbstring a été conçu à la base pour les pages web japonaises.
Pré-requis de l'encodage en &php; Les jeux de caractères suivants sont bien supportés par &php;. Jeux de caractères mono-octets : qui sont compatibles avec la norme ASCII (compatible ISO646) pour les caractères de l'intervalle 00h à 7fh. Jeux de caracètres multi-octets : qui sont compatibles avec la norme ASCII (compatible ISO646) pour les caractères de l'intervalle 00h à 7fh. qui n'utilisent pas les séquences de type ISO2022. qui n'utilisent pas de valeur dans l'intervalle 00h à 7fh dans les séquences composées, qui représentent un caractère unique. Les jeux de caractères suivants risquent de ne pas fonctionner en &php;. Jeux de caractères qui risquent de ne pas fonctionner en &php; Même si aucun script &php; écrit avec ces jeux de caractères ne fonctionne, notamment si des chaînes encodées sont utilisées comme identifiants, ou valeurs littérales dans le script, vous pouvez éviter d'utiliser ces jeux en activant le filtre transparent mbstring pour les données d'entrées HTTP. Il est déconseillé d'utiliser les jeux SJIS, BIG5, CP936, CP949 et GB18030 pour l'encodage interne, à moins que vous ne soyez très familiers avec l'analyseur, le scanneur et le jeu de caractère lui-même. Si vous avez une base de données connectée à &php;, il est recommandé d'utiliser le même jeu de caractères dans la base et comme jeu interne pour améliorer le confort d'utilisation et les performances. Si vous utilisez PostgreSQL, le jeu de caractères utilisé dans la base de données et celui de &php; peuvent différer car cette base supporte la traduction automatique de jeu de caractères.
&reference.mbstring.configure; &reference.mbstring.ini;
&reftitle.resources; &no.resource;
&reference.mbstring.constants;
Entrées/Sorties HTTP La conversion automatique des entrées/sorties HTTP peut aussi convertir des données binaires. Les utilisateurs doivent contrôler les conversions, si des données binaires doivent être utilisées via HTTP. Depuis la version 4.3.2 de &php;, il y a une limitation dans l'utilisation des fonctionnalités mbstring : l'encodage ne sera pas effectué dans les données transmises en méthode POST si l'attribut enctype de la balise form vaut multipart/form-data. Donc, vous devrez convertir les données entrantes vous-même dans ce cas, si nécessaire. Depuis la version 4.3.3 de &php;, si l'attribut enctype de la balise form vaut multipart/form-data et que la directive du &php.ini; est positionnée à On, les variables et les noms de fichiers téléchargés en méthode POST seront convertis avec l'encodage interne. Sinon, la conversion ne sera pas faite. Entrée HTTP Il n'y a pas de moyens 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;. Désactive la conversion HTTP dans le 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. 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 de configuration de mbstring dans &php.ini; Exemple de script avec mbstring ]]>
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 UTF-16 UTF-16BE UTF-16LE UTF-7 UTF7-IMAP UTF-8 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 HTML-ENTITIES 7bit 8bit EUC-CN CP936 HZ EUC-TW CP950 BIG-5 EUC-KR UHC (CP949) ISO-2022-KR Windows-1251 (CP1251) Windows-1252 (CP1252) CP866 (IBM866) KOI8-R Les entrées du fichier &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 défini, la liste sera étendue à la liste des encodages définis par NLS. Par exemple, si NLS vaut Japanese, les valeurs seront "ASCII,JIS,UTF-8,EUC-JP,SJIS". Voir aussi mb_detect_order.
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 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 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 rationnelles. 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. 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 2 strtolower mb_strtolower 2 strtoupper mb_strtoupper 2 substr_count mb_substr_count 4 ereg mb_ereg 4 eregi mb_eregi 4 ereg_replace mb_ereg_replace 4 eregi_replace mb_eregi_replace 4 split mb_split
Il n'est pas recommandé d'utiliser les options des fonctions d'overloading dans un contexte de per-directory, car il n'est pas confirmé encore qu'elles sont suffisamment stables dans un environnement de production et peuvent conduire à un résultat incohérent.
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és. 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 encodages de caractères définissent des séquences de début/fin pour les sections multi-octets (00h to 7fh). ISO-2022-JP doit être utilisé pour les protocoles SMTP/NNTP, et les en-têtes ainsi que les entitiés devraient être réencodés en accord avec la RFC correspondante. Bien que cela ne soit pas requis, ca reste une bonne idée car beaucoup de user-agent (agents utilisateurs) populaires ne peuvent pas reconnaître d'autre méthode d'encodage. Les pages Web créées pour les téléphones portables comme i-mode, Vodafone live!, ou EZweb sont supposées utiliser l'encodage 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 &url.unicode; Japonais/coréen/Chinois &url.oreilly.cjk-inf;
&reference.mbstring.encodings;
&reference.mbstring.functions;