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

Une (autre) histoire d'accents

20 réponses
Avatar
Pascale
Je ne sais pas pourquoi, mais les histoires d'accents me poursuivent... (:

J'ai un magnifique formulaire où les gens saisissent leur nom (pas que ça,
évidemment).
Pour faire quelque chose de propret, j'avais décidé de mettre le nom en
capitales, quelque chose du genre :

$nom=trim($_POST['nom']);
if ($nom!='')
{$_SESSION['nom']=strtoupper($nom);}

Le problème est bien sûr la mise en majuscule des caractères accentués...
J'ai testé mon formulaire après avoir ajouté cette fonction : tout allait
bien, les é devenaient É, les à devenaient À, etc. Je demande à mon homme
de tester... il me dit que ça ne marche pas, les é restent é, etc.
Je me dis, bizarre, faut que je réessaye : pas de problème, les lettres
accentuées passent sans problème en majuscule.
Je reteste aujourd'hui (en utilisant le même nom) : ça ne marche pas, les
lettres accentuées restent en minuscule.
Le manuel dit que ça ne marche jamais...
Le PHP aurait-il un côté farceur qui m'aurait échappé ? (:

--
Pascale

10 réponses

1 2
Avatar
Eric Demeester
dans (in) fr.comp.lang.php, Olivier Miakinen <om+
ecrivait (wrote) :

Bonjour,

Il semble (je suis prudente, hein) qu'en mettant
setlocale(LC_CTYPE, 'french');
cela fonctionne.


Attention cependant, si un jour tu changes d'hébergeur tu devras
peut-être remplacer ce 'french' par autre chose


Question d'un béotien qui se passionne depuis longtemps pour l'encodage
des jeux de caractères : l'utilisation d'utf-8 (sensé proposer un codage
universel ou presque) plutôt que d'iso-8859-15, ne permettrait pas de
s'affranchir de façon plus durable et systématique des problèmes
rencontrés par Pascale ?

--
Eric


Avatar
Mickael Wolff

$nom=trim($_POST['nom']);
if ($nom!='')
{$_SESSION['nom']=strtoupper($nom);}


Il y a eu un long troll sur fclc à propos de ces magnifiques fonctions
de l'API C qui compliquent la vie des gentils programmeurs. En regardant
dans le source de PHP, on s'aperçoit que PHP ne fait pas de traitement
spécifique avant d'utiliser la fonction, donc tous les bugs de la
fonction ressurgissent.

Extrait du fichier ./ext/standard/string.c du paquet PHP :

/* {{{ php_strtoupper
*/
PHPAPI char *php_strtoupper(char *s, size_t len)
{
unsigned char *c, *e;

c = s;
e = c+len;

while (c < e) {
*c = toupper(*c);
c++;
}
return s;
}
/* }}} */

La discussion dans fclc s'appelait « Combinaison min/MAJ », et c'était
pas piqué des vers ^^;

++

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
Olivier Miakinen

Question d'un béotien qui se passionne depuis longtemps pour l'encodage
des jeux de caractères : l'utilisation d'utf-8 (sensé proposer un codage
universel ou presque) plutôt que d'iso-8859-15, ne permettrait pas de
s'affranchir de façon plus durable et systématique des problèmes
rencontrés par Pascale ?


Pas avec strtoupper. En revanche, cela pourrait marcher avec :
1) $nom = mb_convert_case($nom, MB_CASE_UPPER, "UTF-8");
2) $nom = mb_strtoupper($nom, "UTF-8");

Du coup, cela devrait *aussi* marcher en ISO-8859-15 avec :
1) $nom = mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15");
2) $nom = mb_strtoupper($nom, "ISO-8859-15");

... et c'est probablement beaucoup plus portable d'un hébergeur à un
autre que de jouer avec le setlocale().

Avatar
Mickael Wolff

Question d'un béotien qui se passionne depuis longtemps pour l'encodage
des jeux de caractères : l'utilisation d'utf-8 (sensé proposer un codage
universel ou presque) plutôt que d'iso-8859-15, ne permettrait pas de
s'affranchir de façon plus durable et systématique des problèmes
rencontrés par Pascale ?


Je t'encourage à lire le thread que j'ai signalé dans un autre message
en réponse à ce fil. Il semblerait que UTF-8, ne soit pas la solution
absolue. Il est à noter que le support multibyte de PHP n'est pas
natif... mais il devrait l'être dans PHP6 (c'est à dire que toutes les
chaînes de caractère seraient à caractères multibyte).

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Avatar
Olivier Miakinen
setlocale(LC_CTYPE, 'french.ISO-8859-15') fonctionne parfaitement, y
compris avec les ÿ, les ¨, les ½, les ç et autres joyeusetés !


Génial ! Malgré tout, puisque la question d'Éric Demeester m'a fait
repenser aux fonctions mb_*, si tu as 5 minutes tu devrais peut-être
tester avec mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15") et
mb_strtoupper($nom, "ISO-8859-15"). Surtout quand on voit comment PHP
implémente strtoupper (cf. article de Mickael Wolff).

Avatar
Pascale
Mickael Wolff écrivait
news:4751c2eb$0$20318$:

La discussion dans fclc s'appelait « Combinaison min/MAJ », et c'était
pas piqué des vers ^^;


J'imagine, oui... (:

--
Pascale

Avatar
Pascale
Olivier Miakinen <om+ écrivait
news:4751cb04$:

1) $nom = mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15");
2) $nom = mb_strtoupper($nom, "ISO-8859-15");


Ces 2 solutions fonctionnent parfaitement (j'ai viré setlocale). Il y en a
une qui est préférable à l'autre pour quelque raison ?

--
Pascale

Avatar
Pascale
Olivier Miakinen <om+ écrivait
news:4751cd44$:

Génial ! Malgré tout, puisque la question d'Éric Demeester m'a fait
repenser aux fonctions mb_*, si tu as 5 minutes tu devrais peut-être
tester avec mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15") et
mb_strtoupper($nom, "ISO-8859-15"). Surtout quand on voit comment PHP
implémente strtoupper (cf. article de Mickael Wolff).


Oui, viens de voir ça, donc ça m'intéresse de tester cette autre solution.
D'abord, j'ai un poulet à faire cuire, donc le temps de hacker la
cuisinière à gaz et je m'en occupe.

Je croyais poser une question c.. et finalement, elle est plus coriace que
je ne croyais...

--
Pascale

Avatar
Olivier Miakinen

1) $nom = mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15");
2) $nom = mb_strtoupper($nom, "ISO-8859-15");


Ces 2 solutions fonctionnent parfaitement (j'ai viré setlocale).


Parfait. Ça t'évitera quelques cheveux blancs si un jour tu changes
d'hébergeur (ou si ton hébergeur change de version du système).

Il y en a une qui est préférable à l'autre pour quelque raison ?


Ça c'est une question qui revient souvent avec les fonctions PHP : elles
sont tellement nombreuses qu'il y a souvent plusieurs façons de faire la
même chose. À mon avis, tu peux tirer à pile ou face, ou bien choisir
celle que tu préfères selon le critère que tu voudras (plus lisible,
plus courte à taper, plus simple à retenir, plus générique, etc.)


Avatar
Pascale
Olivier Miakinen <om+ écrivait
news:47532197$:

Parfait. Ça t'évitera quelques cheveux blancs si un jour tu changes
d'hébergeur (ou si ton hébergeur change de version du système).


Ça peut toujours arriver... et j'ai déjà bien assez de cheveux blancs...

Ça c'est une question qui revient souvent avec les fonctions PHP : elles
sont tellement nombreuses qu'il y a souvent plusieurs façons de faire la
même chose.


J'avais cru remarquer, en effet (!)

À mon avis, tu peux tirer à pile ou face, ou bien choisir
celle que tu préfères selon le critère que tu voudras (plus lisible,
plus courte à taper, plus simple à retenir, plus générique, etc.)


C'est ce que j'ai fait : mb_strtoupper($nom, "ISO-8859-15") l'emporte d'une
courte tête sur mb_convert_case($nom, MB_CASE_UPPER, "ISO-8859-15") (:

Merci à tous pour votre aide !

--
Pascale

1 2