Probleme de prise en compte d'un setlocale
Le
Mathieu Goutelle
Bonjour,
J'ai une fonction qui « capitalise » les mots de façon un peu meilleur
que ucwords :
function ucsmart($texte) {
return stripslashes(preg_replace('/(\W|^)(\w)/e',
'"$1".strtoupper("$2")', strtolower($texte)));
}
Le problème est que \W et \w dépendent de la locale (pour les
majuscules accentuées). J'ai donc placé quelque part (un fichier qui
est inclus pour tout le site) un setlocale approprié :
setlocale(LC_ALL, 'fr_FR', 'french', 'fr');
Le problème est que ça marche dans tous les petits tests que je fais et
que sur le site (http://www.clubamis2cv.org/, sur les noms des villes
sur la droite), ça marche parfois (il suffit de recharger la page). Le
comportement est identique si je le place dans la fonction ou n'importe
où ailleurs.
Une idée pour que le comportement devienne déterministe ?
Cordialement,
--
Q: Connaissez-vous la différence entre l'ignorance et l'apathie ?
R: J'en sais rien et je m'en fous.
Mathieu Goutelle - <URL:http://www.cadichonne.net/>
J'ai une fonction qui « capitalise » les mots de façon un peu meilleur
que ucwords :
function ucsmart($texte) {
return stripslashes(preg_replace('/(\W|^)(\w)/e',
'"$1".strtoupper("$2")', strtolower($texte)));
}
Le problème est que \W et \w dépendent de la locale (pour les
majuscules accentuées). J'ai donc placé quelque part (un fichier qui
est inclus pour tout le site) un setlocale approprié :
setlocale(LC_ALL, 'fr_FR', 'french', 'fr');
Le problème est que ça marche dans tous les petits tests que je fais et
que sur le site (http://www.clubamis2cv.org/, sur les noms des villes
sur la droite), ça marche parfois (il suffit de recharger la page). Le
comportement est identique si je le place dans la fonction ou n'importe
où ailleurs.
Une idée pour que le comportement devienne déterministe ?
Cordialement,
--
Q: Connaissez-vous la différence entre l'ignorance et l'apathie ?
R: J'en sais rien et je m'en fous.
Mathieu Goutelle - <URL:http://www.cadichonne.net/>

Poser une question


Tiens, je te remercie de me rafraîchir la mémoire à propos de l'option
'e' de preg_replace(). Je ne l'ai encore jamais utilisée, mais ça peut
être pratique.
Il n'y a pas que W et w qui dépendent de la locale, mais aussi
strtolower() et strtoupper().
Tu veux dire que sur un système donné dans une config donnée et pour un
mot donné cela marche parfois mais pas toujours ? Voilà qui est fort
curieux.
Peut-être remplacer w par [a-zà-þ], W par [^a-zà-þ], et réécrire les
fonctions strtolower() et strtoupper() au moyen d'autres preg_replace()
(mes exemples pour w et W sont en supposant ISO-8859-1, et en espérant
qu'il n'y ait pas de caractère ÷, sinon il faut compliquer un peu le truc).
Attention : si cela marche toujours sur certains systèmes et jamais sur
d'autres, plutôt qu'aléatoirement sur un système donné, c'est peut-être
parce que le paramètre du setlocale() n'est pas le bon là où ça ne
fonctionne pas.
Dans l'article
Ça sert toujours à quelque chose de discuter de ses problèmes : cela ne
pourrait-il pas venir d'un load balancing sur plusieurs machines, dont
l'une n'aurait pas la locale 'fr' installée ?
Je vais investiguer de ce côté avec l'hébergeur...
Merci pour l'inspiration,
Cordialement,
--
Q: Connaissez-vous la différence entre l'ignorance et l'apathie ?
R: J'en sais rien et je m'en fous.
Mathieu Goutelle - http://www.cadichonne.net/