Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme de prise en compte d'un setlocale

2 réponses
Avatar
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/>

2 réponses

Avatar
Olivier Miakinen

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)));
}


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.

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');


Il n'y a pas que W et w qui dépendent de la locale, mais aussi
strtolower() et strtoupper().

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).


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.

Une idée pour que le comportement devienne déterministe ?


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.

Avatar
Mathieu Goutelle
Bonsoir,

Dans l'article <45536321$, Olivier Miakinen a écrit :

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.


Ç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/