Discussion:
Une (autre) histoire d'accents
(trop ancien pour répondre)
Pascale
2007-11-29 19:00:38 UTC
Permalink
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
Olivier Miakinen
2007-11-29 19:15:30 UTC
Permalink
Post by Pascale
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.
Tout ceci dépendra de plusieurs paramètres, en particulier le charset
utilisé pour coder la page, et les informations de localisation :
http://fr2.php.net/manual/fr/function.setlocale.php
(LC_CTYPE).
Post by Pascale
Le manuel dit que ça ne marche jamais...
Non, il dit que ça ne marche pas avec la configuration par défaut ("C")
Ah oui, certainement ! :-D
Pascale
2007-11-30 13:26:59 UTC
Permalink
Post by Olivier Miakinen
Tout ceci dépendra de plusieurs paramètres, en particulier le charset
utilisé pour coder la page,
iso-8859-15
Post by Olivier Miakinen
http://fr2.php.net/manual/fr/function.setlocale.php
(LC_CTYPE).
(et c'est là qu'on entend un grand cri de détresse venant de mon humble
personne)
Post by Olivier Miakinen
Non, il dit que ça ne marche pas avec la configuration par défaut ("C")
Oups, je promets d'apprendre à lire...
Post by Olivier Miakinen
Ah oui, certainement ! :-D
Ce qui est dit dans le warning pourrait-il expliquer le comportement
aléatoire de la fonction strtoupper ? Ou bien j'ai encore tout compris de
travers...
Pour information, que le serveur de notre hébergeur est un serveur Apache
mais sous Linux...

« Y a quèqu'chose qui cloche là-d'dans,
J'y retourne immédiatement »
--
Pascale
Pascale
2007-11-30 14:25:38 UTC
Permalink
Il semble (je suis prudente, hein) qu'en mettant
setlocale(LC_CTYPE, 'french');
cela fonctionne.

Olivier, tu es mon sauveur multi-récidiviste !
--
Pascale
Olivier Miakinen
2007-11-30 14:55:08 UTC
Permalink
Post by Pascale
Il semble (je suis prudente, hein) qu'en mettant
setlocale(LC_CTYPE, 'french');
cela fonctionne.
Bravo !

Attention cependant, si un jour tu changes d'hébergeur tu devras
peut-être remplacer ce 'french' par autre chose (par exemple 'fr'
ou 'fr-FR' ou encore 'fr_FR', voire 'fra' ou 'fre')... La plus
grande anarchie règne en la matière entre Windows, Linux, et les
différentes variétés d'Unix.
Post by Pascale
Olivier, tu es [...] multi-récidiviste !
Chut ! On ne sait jamais, Sarko pourrait nous lire...
Pascale
2007-11-30 16:08:52 UTC
Permalink
Post by Olivier Miakinen
Bravo !
Yapadkoi, tout le mérite t'en revient, si si si !
Post by Olivier Miakinen
Attention cependant, si un jour tu changes d'hébergeur tu devras
peut-être remplacer ce 'french' par autre chose (par exemple 'fr'
ou 'fr-FR' ou encore 'fr_FR', voire 'fra' ou 'fre')... La plus
grande anarchie règne en la matière entre Windows, Linux, et les
différentes variétés d'Unix.
C'est bien possible en effet. J'ai consulté les liens donnés à partir du
manuel PHP, ça a effectivement l'air d'être un bintz pas croyable.
Dans un premier temps, j'avais mis 'fra' et cela ne fonctionnait pas, mais
je me doute bien qu'ailleurs, ça peut fonctionner...
Post by Olivier Miakinen
Chut ! On ne sait jamais, Sarko pourrait nous lire...
C'est vrai, ça, faut faire gaffe, de nos jours...
--
Pascale
Eric Demeester
2007-12-01 19:35:02 UTC
Permalink
dans (in) fr.comp.lang.php, Olivier Miakinen <om+***@miakinen.net>
ecrivait (wrote) :

Bonjour,
Post by Olivier Miakinen
Post by Pascale
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
Olivier Miakinen
2007-12-01 21:03:22 UTC
Permalink
Post by Eric Demeester
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().
Pascale
2007-12-02 15:52:26 UTC
Permalink
Post by 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). Il y en a
une qui est préférable à l'autre pour quelque raison ?
--
Pascale
Olivier Miakinen
2007-12-02 21:24:41 UTC
Permalink
Post by Pascale
Post by 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).
Post by Pascale
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.)
Pascale
2007-12-03 10:21:14 UTC
Permalink
Post by Olivier Miakinen
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...
Post by Olivier Miakinen
Ç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 (!)
Post by Olivier Miakinen
À 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
Mickael Wolff
2007-12-01 21:03:22 UTC
Permalink
Post by Eric Demeester
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
Olivier Miakinen
2007-11-30 15:04:57 UTC
Permalink
Post by Pascale
Il semble (je suis prudente, hein) qu'en mettant
setlocale(LC_CTYPE, 'french');
cela fonctionne.
Pendant que j'y pense... tu dis être en ISO-8859-15. Du coup, je parie
que les conversions suivantes ne fonctionneront pas (mais que ce seront
les seules) :
œ -> Œ
ÿ -> Ÿ
š -> Š
ž -> Ž
En effet, les caractères Š, š, Ž, ž, Œ, œ et Ÿ sont dans ISO-8859-15
mais pas dans ISO-8859-1, toutes les autres lettres étant aux mêmes
emplacements dans les deux jeux de caractères.

Si tu as un peu de temps pour jouer avec le setlocale, essaye des trucs
du genre de '***@euro', 'french.ISO-8859-15' et ainsi de suite. Ou
alors cherche dans la doc (man setlocale ?) pour trouver la bonne syntaxe.
Pascale
2007-11-30 16:08:52 UTC
Permalink
Post by Olivier Miakinen
Pendant que j'y pense... tu dis être en ISO-8859-15. Du coup, je parie
que les conversions suivantes ne fonctionneront pas (mais que ce
œ -> Œ
ÿ -> Ÿ
š -> Š
ž -> Ž
En effet, les caractères Š, š, Ž, ž, Œ, œ et Ÿ sont dans ISO-8859-15
mais pas dans ISO-8859-1, toutes les autres lettres étant aux mêmes
emplacements dans les deux jeux de caractères.
Si tu as un peu de temps pour jouer avec le setlocale, essaye des
suite. Ou alors cherche dans la doc (man setlocale ?) pour trouver la
bonne syntaxe.
Pour ma culture personnelle, ça m'intéresse, mais honnêtement, je vais pas
m'y plonger tout de suite, car ce que je mets en capitales, ce sont
simplement des noms propres de personnes. Bon, je sais bien qu'il peut y
avoir des noms exotiques, mais on verra. Je vais quand même faire quelques
tests (-:
--
Pascale
Olivier Miakinen
2007-11-30 18:55:54 UTC
Permalink
Post by Pascale
Pour ma culture personnelle, ça m'intéresse, mais honnêtement, je vais pas
m'y plonger tout de suite, car ce que je mets en capitales, ce sont
simplement des noms propres de personnes.
Messieurs MœBIUS et Pierre LOUÿS seront peut-être heureux que cela
fonctionne pour eux. Bon, je sais, c'est plutôt rare.
:-)
Pascale
2007-12-01 12:43:15 UTC
Permalink
Post by Olivier Miakinen
Messieurs MœBIUS et Pierre LOUÿS seront peut-être heureux que cela
fonctionne pour eux. Bon, je sais, c'est plutôt rare.
C'est vrai, ça ne marche pas... Zut.
Dommage. J'ose pas imaginer la description du jardin de Pierre Louÿs
(puisque c'est de ça qu'il est question)... (o;
Comme tu dis, je vais essayer de voir si je trouve une syntaxe qui
fonctionnerait...
--
Pascale
Pascale
2007-12-01 12:43:15 UTC
Permalink
setlocale(LC_CTYPE, 'french.ISO-8859-15') fonctionne parfaitement, y
compris avec les ÿ, les š, les œ, les ç et autres joyeusetés !
Merci, m'sieur ! (o;
--
Pascale
Olivier Miakinen
2007-12-01 21:10:18 UTC
Permalink
Post by Pascale
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).
Pascale
2007-12-02 15:52:26 UTC
Permalink
Post by Olivier Miakinen
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
Mickael Wolff
2007-12-01 21:03:22 UTC
Permalink
Post by Pascale
$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
Pascale
2007-12-02 15:52:26 UTC
Permalink
Post by Mickael Wolff
La discussion dans fclc s'appelait « Combinaison min/MAJ », et c'était
pas piqué des vers ^^;
J'imagine, oui... (:
--
Pascale
Continuer la lecture sur narkive:
Loading...