UTF-8
Dernière modification : 2007/08/04 01:31
Depuis la version 2.20, TigerWiki fonctionne en UTF-8. Pour ma part mon système y était déjà.
Avant toute chose, lire cette vulgarisation des concepts de base table de translation
Loin d'être un spécialiste en encodage de caractères, j'ai quand même relevé lors de mes tests quelques points qui peuvent poser problème AMHA.
Ce qui donnerait pour un système utf-8 (ligne 200 de la 2.21)
Mais le support de l'utf-8 n'est présent qu'a partir de php 5 malheureusement loin d'être disponible partout :(
Du coup j'ai carrément commenté la ligne et cela ne semble pas poser de problème. Les caractères restent encodés en entités html (é).
Hors quand la page est déjà en UTF-8, le navigateur envoi (ou devrait) les données en UTF-8 les caractères sont alors doublement encodés.
Peut-être que mb_convert_encoding serait plus adaptée
Après quelques tests, voici mes propositions préliminaires. Comme je ne comprends pas encore très bien, il y a sans-doute des erreurs. L'idée principale est d'utiliser le module php mbstring
Positionner l'ordre de détection ainsi pour gérer ces deux charsets :
Pour l'Edit d'une page, détecter le charset de l'entrée et convertir en utf-8 avant d'enregistrer le fichier :
Pour l'affichage d'une page, lire le fichier (en utf-8 donc) et convertir vers le charset demandé ($CHARSET)
on peut même détecter le charset du fichier lu. cela devrait permettre de conserver des pages en ISO-8859
Pour positionner la surcharge de mbstring on peut utiliser :
Pour essayer de comprendre un peu tout cela, j'ai fait un petit script qui utilise le module mbstring.
Voir test_charset
Avant toute chose, lire cette vulgarisation des concepts de base table de translation
Loin d'être un spécialiste en encodage de caractères, j'ai quand même relevé lors de mes tests quelques points qui peuvent poser problème AMHA.
Problèmes
- htmlentities qui est utilisé en début de formatage
Ce qui donnerait pour un système utf-8 (ligne 200 de la 2.21)
$CONTENT = htmlentities($CONTENT,ENT_COMPAT,"UTF-8");
- html_entity_decode en fin de formatage
$CONTENT = html_entity_decode($CONTENT,ENT_COMPAT,"UTF-8");
Mais le support de l'utf-8 n'est présent qu'a partir de php 5 malheureusement loin d'être disponible partout :(
Du coup j'ai carrément commenté la ligne et cela ne semble pas poser de problème. Les caractères restent encodés en entités html (é).
- utf8_encode utilisé pour convertir en utf-8 les pages saisies
Hors quand la page est déjà en UTF-8, le navigateur envoi (ou devrait) les données en UTF-8 les caractères sont alors doublement encodés.
Peut-être que mb_convert_encoding serait plus adaptée
- même chose pour utf8_decode
- Quid de la variable de config $CHARSET ?
Propositions
Après quelques tests, voici mes propositions préliminaires. Comme je ne comprends pas encore très bien, il y a sans-doute des erreurs. L'idée principale est d'utiliser le module php mbstring
Positionner l'ordre de détection ainsi pour gérer ces deux charsets :
mb_detect_order(array("UTF-8","ISO-8859-1"));
Pour l'Edit d'une page, détecter le charset de l'entrée et convertir en utf-8 avant d'enregistrer le fichier :
mb_convert_encoding($_POST['content'],"UTF-8",mb_detect_encoding($_POST['content']))
Pour l'affichage d'une page, lire le fichier (en utf-8 donc) et convertir vers le charset demandé ($CHARSET)
$CONTENT = mb_convert_encoding($CONTENT,$CHARSET,"UTF-8");
on peut même détecter le charset du fichier lu. cela devrait permettre de conserver des pages en ISO-8859
$CONTENT = mb_convert_encoding($CONTENT,$CHARSET,mb_detect_encoding($CONTENT));
Pour positionner la surcharge de mbstring on peut utiliser :
- mbstring.func_overload dans php.ini
- directement dans le code avec ini_set()
Questions à creuser
- Quid des autres charsets que UTF-8 et ISO-8859-*
- Est-ce que les fonctions de traitement de chaines utilisées sont compatibles UTF-8
- mbstring propose des équivalents, mais est-ce que les besoins sont couverts → à vérifier dans le code
- que dire des traitements par expression régulières preg_* → semble compatible
- Quelle valeur utiliser pour mbstring.func_overload
Test
Pour essayer de comprendre un peu tout cela, j'ai fait un petit script qui utilise le module mbstring.
Voir test_charset