enlever les accents

youplop
Invité n'ayant pas de compte PHPfrance

10 déc. 2010, 19:13

Bonsoir
J'aurais besoin dans une page d'une fonction qui supprime les accents.

J'ai essayé ceci:
function stripAccents($string){
	return strtr($string,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ',
                             'aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');
}
Mais les accents ne sont pas enlevés, ils sont remplacés par d'autres caractères:
é ; è ; à ; ï deviennent respectivement Yo ; Yi ; Ya ; YA

Une idée?

La page est en utf-8.

Eléphant du PHP | 209 Messages

10 déc. 2010, 19:19

Je suis tombé une fois la dessus :
setlocale(LC_ALL, 'fr_FR.UTF8');
$data = iconv('UTF8', 'ASCII//TRANSLIT', $data);
A adapter en fonction de son encodage, bien sur.
--
Eric

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 19:23

Je suis tombé une fois la dessus :
setlocale(LC_ALL, 'fr_FR.UTF8');
$data = iconv('UTF8', 'ASCII//TRANSLIT', $data);
A adapter en fonction de son encodage, bien sur.
ca marche pas partout ca, en plus c'est pas bon c'est UTF-8 il faut aussi rajouter le IGNORE et si la lib n'est pas compilée avec libiconv c'est foutu

Eléphant du PHP | 209 Messages

10 déc. 2010, 19:27

Oui, d'accord pour le "ça ne marche pas partout" il faut fatalement le bon encodage de départ et libiconv, mais par contre pourquoi "c'est pas bon c'est UTF-8" ?
--
Eric

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 19:29

Oui, d'accord pour le "ça ne marche pas partout" il faut fatalement le bon encodage de départ et libiconv, mais par contre pourquoi "c'est pas bon c'est UTF-8" ?
parce que t'as mis UTF8 c'est UTF-8 (avec un tiret)
le setlocale ne sert pas non plus

Eléphant du PHP | 209 Messages

10 déc. 2010, 19:43

chaine = "éééééaaaaaàààà\n";

echo iconv('UTF-8', 'ASCII//TRANSLIT', $chaine);
echo iconv('UTF8', 'ASCII//TRANSLIT', $chaine);
setlocale(LC_ALL, 'fr_FR.UTF8');
echo iconv('UTF-8', 'ASCII//TRANSLIT', $chaine);
echo iconv('UTF8', 'ASCII//TRANSLIT', $chaine);
setlocale(LC_ALL, 'C');
echo iconv('UTF-8', 'ASCII//TRANSLIT',$chaine);
echo iconv('UTF8', 'ASCII//TRANSLIT', $chaine);
setlocale(LC_ALL, 'fr_FR.UTF-8');
echo iconv('UTF-8', 'ASCII//TRANSLIT',$chaine);
echo iconv('UTF8', 'ASCII//TRANSLIT', $chaine);

?????aaaaa????
?????aaaaa????
eeeeeaaaaaaaaa
eeeeeaaaaaaaaa
?????aaaaa????
?????aaaaa????
eeeeeaaaaaaaaa
eeeeeaaaaaaaaa


(PHP 5.3.2-1ubuntu4.5)
--
Eric

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 19:45

'e'e'e'e'eaaaaa`a`a`a`a
Notice: iconv(): Wrong charset, conversion from `UTF8' to `ASCII//TRANSLIT' is not allowed
'e'e'e'e'eaaaaa`a`a`a`a
Notice: iconv(): Wrong charset, conversion from `UTF8' to `ASCII//TRANSLIT' is not allowed
'e'e'e'e'eaaaaa`a`a`a`a
Notice: iconv(): Wrong charset, conversion from `UTF8' to `ASCII//TRANSLIT' is not allowed
'e'e'e'e'eaaaaa`a`a`a`a
Notice: iconv(): Wrong charset, conversion from `UTF8' to `ASCII//TRANSLIT' is not allowed
sur un WIN PHP 5.3.4
Modifié en dernier par stealth35 le 10 déc. 2010, 19:47, modifié 1 fois.

youplop
Invité n'ayant pas de compte PHPfrance

10 déc. 2010, 19:46

Merci pr vos réponses
J'essaie tout de suite

Eléphant du PHP | 209 Messages

10 déc. 2010, 19:51

Ok, donc sur Ubuntu, le setlocale est nécessaire, par contre sous Windows, il ne comprend pas l'alias "UTF8".

Donc quelque chose comme ca devrait fonctionner partout ? (si libiconv et si fr_FR.UTF-8 présent sur le système sous Linux)
setlocale(LC_ALL, 'fr_FR.UTF-8');
$data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
--
Eric

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 20:23

Ok, donc sur Ubuntu, le setlocale est nécessaire, par contre sous Windows, il ne comprend pas l'alias "UTF8".

Donc quelque chose comme ca devrait fonctionner partout ? (si libiconv et si fr_FR.UTF-8 présent sur le système sous Linux)
setlocale(LC_ALL, 'fr_FR.UTF-8');
$data = iconv('UTF-8', 'ASCII//TRANSLIT', $data);
non libiconv ne prend pas en compte la locale et fait le tranlist diffament
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
'e'e'e'e'eaaaaa`a`a`a`a
OSX PHP 5.3.4 libiconv

ton iconv doit etre sous glibc (qui lui prend la locale)

pour voir avec quoi est compiler iconv :
var_dump(ICONV_IMPL, ICONV_VERSION);

Eléphant du PHP | 209 Messages

10 déc. 2010, 20:43

Gagné :
string(5) "glibc"
string(6) "2.11.1"

Hum.... du coup, c'est quoi la solution portable ?
--
Eric

youplop
Invité n'ayant pas de compte PHPfrance

10 déc. 2010, 20:43

L'OS de mon serveur est Linux phpn5-g5.priv.free.fr
J'ai testé avec
	setlocale(LC_ALL, 'fr_FR.UTF-8');
	$data = iconv('UTF-8', 'ASCII//TRANSLIT', $chaine);
Cela me renvoie l'erreur suivante

Notice: iconv() [function.iconv]: Detected an illegal character in input string

ViPHP
ViPHP | 3607 Messages

10 déc. 2010, 20:45

Et sinon au lieu de se compliquer la vie...
Il faut simplement utiliser un str_replace() et ça ira...
en effet strstr semble bugguer pour l'utf8:
function stripAccents($string){
    $search = array('a','a','a','a','a',...);
    $replace = array('à','á','â','ã','ä',...);
    return str_replace($search,$replace,$string);
}
C'est un peu plus long à écrire, mais ça a le mérite d'être fonctionnel :)

ViPHP
ViPHP | 5462 Messages

10 déc. 2010, 21:17


youplop
Invité n'ayant pas de compte PHPfrance

10 déc. 2010, 21:42

merci jojolapine!
str_replace() marche!
j'ai un peu galéré au début car je mettais le texte en minuscule au début, ce qui modifiait le code des accents.

Enfin voila tt marche nickel :)
merci a vous