Mb_ereg_replace et utf-8

WRInaute discret
J'essaie d'utiliser des expressions régulières avec l'utf-8. Je galère un max.
J'en suis arrivé à cet exemple que je n'arrive pas à comprendre :

Code:
mb_internal_encoding("UTF-8");mb_regex_encoding("UTF-8");

echo mb_ereg_replace('[à]', '#', 'test à'); // test à
echo mb_ereg_replace('à', '#', 'test à'); // test #

Tout semble bien marcher avec les caractères non ascii sauf quand ils sont entre crochets. Ce qui limite grandement l'intérêt des expressions régulières...

Si quelqu'un a une explication je suis preneur !

PS : je précise que mon fichier est bien en UTF-8.
 
WRInaute discret
Heu... si vous pensez que je fais de la merde, n'hésitez pas à le dire ! Parce que là je comprends vraiment pas pourquoi ça ne détecte pas le 'à' dans le premier cas.

Je sais aussi que mettre 'à' tout seul entre crochets n'a pas d'intérêt, mais j'ai pris ici l'exemple minimal qui me posait problème.

Merci.
 
WRInaute impliqué
salut,
chez moi :
Code:
root@vserver1:/root# locale
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
root@vserver1:/root# php
<?php
mb_internal_encoding("UTF-8");mb_regex_encoding("UTF-8");

echo mb_ereg_replace('[à]', '#', 'test à'); // test à
echo mb_ereg_replace('à', '#', 'test à'); // test #
test #test #root@vserver1:/root#

çà semble fonctionner comme attendu ...

quand on peut, le plus simple pour gérer l'UTF-8 c'est que tout la chaine soit UTF-8 : serveur -> apache -> source

a+
 
WRInaute discret
Merci beaucoup pour ta réponse Julienr ! Et sympa d'avoir essayé chez toi.

Ça doit en effet venir du serveur (qui est un mutualisé donc je peux pas y faire grand chose).
Ça me réconcilie avec les expression rationnelles du coup, je commençais à ne plus avoir la foi en php ! :D

Encore merci.
 
WRInaute passionné
Si tu peux ;)

Met cela dans un fichier de config
Code:
setlocale(LC_ALL, 'fr_FR.UTF-8');
ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.http_input', 'UTF-8');
ini_set('mbstring.http_output', 'UTF-8');
ini_set('mbstring.detect_order', 'auto');
 
WRInaute impliqué
Toma a dit:
Encore merci.

De rien vraiment :-)
Enfin normalement même si ton mutu est ISO-8859-1, çà devrait fonctionner à partir du moment ou tes sources sont bien UTF-8,
en effet l'UTF-8 est compatible avec l'ISO mais pas l'inverse.
Comment édites-tu en UTF-8 et comment transferts-tu ?
a+
 
WRInaute discret
Bon, je suis pas sur d'avoir compris l'histoire du fichier de config. Enfin, j'ai mis les instructions dans mon fichier php, voilà ce que ça donne :

Code:
<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");
setlocale(LC_ALL, 'fr_FR.UTF-8');
ini_set('mbstring.internal_encoding', 'UTF-8');
ini_set('mbstring.http_input', 'UTF-8');
ini_set('mbstring.http_output', 'UTF-8');
ini_set('mbstring.detect_order', 'auto');

echo mb_ereg_replace('[à]', '#', 'test à');
echo mb_ereg_replace('à', '#', 'test à');
?>

et en sortie j'ai toujours :

Code:
test àtest #

Je ne pense pas que cela vienne de mon éditeur (Gedit) car j'ai toujours utilisé l'UTF-8 et je n'ai jamais eu aucun problème. Je visualise le résultat sur Firefox, avec le bon encodage, pas de soucis de ce coté. Et je transfère depuis toujours avec gFTP, je n'ai jamais eu de problèmes avec UTF-8.

Par contre, comme cela fonctionne chez vous et que je suis sur un mutualisé chez 1and1, je pense que ça viendrait plutôt de là. La version de php est 4.4.9, le problème ne serait pas ici ?

C'est pas trop grave non plus, je vais installer php chez moi pour développer mon petit script (en espérant que cela fonctionne). Et comme ça si je veux l'utiliser, je partirai de chez 1and1, ça sera pas une mauvaise chose ! :wink:

Merci à vous deux.
 
Discussions similaires
Haut