Introduction: PHP et le Japonais

Faisons une petite expérience! Supposons que votre système soit capable d'afficher les caractères japonais...
Éditez un fichier php et entrez-y le code suivant:

<?php echo strlen('元気ですか?'); ?>

La phrase 元気ですか? que l'on pourrait traduire par "Comment allez-vous?" ou "Est-ce que ça va?" contient deux kanji, trois hiragana et un point d'interrogation. Cette phrase contient donc 6 caractères.

On pourrait donc s'attendre naturellement à ce que le code PHP précédent retourne comme résultat: "6".

Eh bien pour autant... A l'heure où j'écris ces lignes, et partant d'une installation standard de PHP 5.3.3 sous Debian Squeeze le résultat qui s'affiche chez moi est "18".

Peut-être en est-il de même chez vous? Si c'est le cas, ne vous inquiétez pas. J'ai peut-être la solution pour vous éviter l'overdose d'aspirine.

Pour la petite histoire, PHP ne gère pas l'unicode en natif. Pour gérer ce type d'encodage, il faut utiliser des extensions. L'extension qui est peut-être la plus utilisée pour ce type de traitement est mbstring qui fournit des alternatives à un grand nombre de fonctions dont, entre autre: mb_strlen qui est l'équivalent de strlen. Cette extension est d'ailleurs tellement utilisée qu'elle est généralement installée par défaut, il ne nous reste donc qu'à configurer son comportement.

Nous allons donc passer par deux étapes:

  1. Configuration de l'extension mbstring
  2. Surcharges des fonctions standard par celles de mbstring

Configuration de l'extension mbstring

En effet, si vous tentez de suite d'utiliser mb_strlen à la place de strlen, il se peut que vous obteniez exactement le même résultat.

Rendez-vous d'abord dans votre fichier de configuration php.ini et cherchez toute ligne contenant mbstring.internal_encoding.

Sous Debian par exemple il y a la bloc suivant:

; internal/script encoding.
; Some encoding cannot work as internal encoding.
; (e.g. SJIS, BIG5, ISO-2022-*)
; http://php.net/mbstring.internal-encoding
;mbstring.internal_encoding = EUC-JP

Décommentez alors la dernière ligne ou copiez là juste en dessous et modifiez-la de façon à obtenir :

mbstring.internal_encoding = UTF-8

Maintenant, si vous exécutez le code fournit en début de cet article, vous aurez toujours "18", mais si vous remplacez la fonction strlen par mb_strlen, vous devriez obtenir "6".(1)

Surcharge des fonctions standards par celles de mbstring

Oh bonne mère! Je vais devoir changer toutes mes fonctions str* par des mb_str* !!?

Mais non! Détendez-vous! PHP veille sur vous... Nous allons tout simplement lui demander d'utiliser les fonctions mb_* automatiquement.

Pour cela, retournons dans php.ini. Cette fois-ci cherchez la ligne

;mbstring.func_overload = 0

et rajoutez (ou remplacez-la par):

mbstring.func_overload = 7

(Alors normalement, il y a un truc de masque avec 0,1,2,4 que vous aurez tout le temps d'approfondir. Mais là, on va au plus simple: on active mbstring pour tout. Donc la valeur à mettre, c'est 7.)

Maintenant, si vous retournez lancer le script d'exemple, vous devriez avoir un joli "6" réconfortant qui apparaît, preuve que la modification est en place et qu'il ne vous reste plus qu'à profiter de l'unicode avec vos fonctions str* et la langue que vous voulez.

Conclusion

Si le support de l'unicode est plus ou moins possible avec PHP, il nécessite cependant que l'on s'attarde quelques fois sur la configuration de l'environnement. L'utilisation de mbstring est une solution provisoire qui fonctionne relativement bien mais qui reste parfois difficile à obtenir dans certains cas tels que les hébergement mutualisés.


(1): PHP peut être utilisé soit en ligne de commande, soit derrière un serveur web comme apache. En ligne de commande, toute modification du fichier /etc/php5/cli/php.ini sera de suite effectif, mais dans le cas d'un serveur web (/etc/php5/apache/php.ini par exemple), pensez à bien redémarrer le service à chaque modification.