8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous !

Alors là je sèche complètement, j'utilise une fonction qui marchait avant et qui ne répond plus de rien aujourd'hui : strtr().

J'ai un script PHP censé supprimer les accents d'une chaîne, sauf qu'il ne fait absolument rien, je rentre "è" il me sort "è", rien de plus rien de moins...

J'ai essayé de rajouter des utf8_decode, utf8_encode, tout ce que vous voulez rien n'y a fait !


function supprAccents($aChaine)
{
   $accent   ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞß$@àáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
   $noaccent="AAAAAAACEEEEIIIIDNOOOOOOUUUUYBSSaaaaaaaaceeeeiiiidnoooooouuuyyby";
   $chaine	=	strtr(trim($aChaine),$accent,$noaccent);
   return $chaine;
}


Une idée ?

Merci d'avance.
Modifié par vever (23 Sep 2011 - 14:37)
Tu es certain d'avoir le même nombre de caractère dans les 2 chaînes de comparaison ? (sur une liste comme celle-ci, ça peut arriver d'en oublier un ^^)
A mon avis dans ta chaîne accentuée, il faut échapper le caractère $, histoire qu'il ne croit pas être en présence d'une variable...
Zed13 : le caractère suivant est invalide en tant que nom de variable, donc PHP ne devrait pas avoir de confusion.

strtr ne marche chez moi que dans un cas précis:

- utf8_decode sur la chaîne d'entrée
- utf8_encode sur la chaîne de sortie
- page en utf8

Lothindil : vérifié, la longueur est la même, si on passe pas en mb (mb_strlen retourne évidemment deux fois plus de longueur pour la chaîne accuentuée).

EDIT : n'oubliez pas que PHP et UTF8, pour le moment, ça reste délicat (et PHP6 n'arrivant pas, justement pour ça...). Ce genre de manips est toujours olé/olé.
Modifié par Lpu8er (07 Sep 2011 - 16:59)
strtr ne fonctionne pas en UTF-8, il faut utiliser str_replace à la place. Aucune fonction str* ne supporte l'UTF-8.

Lpu8er a écrit :
et PHP6 n'arrivant pas, justement pour ça...


PHP 6 a été abandonné il y a presque 2 ans.
Modifié par jb_gfx (07 Sep 2011 - 17:39)
Mais ma page est encodée en ISO-8859-1...
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


De plus j'ai essayé avec str_replace en adaptant le code pour coller avec cette fonction, ça ne marchait pas non plus ! Smiley sweatdrop
Merci, je viens de la tester : toujours aucun résultat ! Mes lettres accentuées restent des lettres accentuées... Je n'y comprend rien, d'autant plus que j'imagine que ton script est censé fonctionner, tout comme le mien !
La fonction est supprAccents($string).


<tr>
     <td><?php echo $evt["intitule"]; ?></td>
     <td><a href="http://maps.google.fr/maps?f=q&source=s_q&hl=fr&geocode=&q=<?php echo sans_supprAccents($evt["ville"]."+".$evt["lieu"]); ?>&ie=UTF8&hq=<?php echo sans_supprAccents($evt["lieu"]); ?>&hnear=<?php echo supprAccents($evt["ville"]); ?>&iwloc=A" target="_blank"><?php echo $evt["ville"].", ".$evt["lieu"]; ?></a><br /><?php echo datetimeFR($evt["date_evenement"],-3); ?></td>
     <td><?php echo $evt["details"]; ?></td>
</tr>
jb_gfx a écrit :
strtr ne fonctionne pas en UTF-8, il faut utiliser str_replace à la place. Aucune fonction str* ne supporte l'UTF-8.


Un peu réducteur. La grande majorité des str_ fonctionnent. Pour des besoins spécifiques aux chaînes comme celles UTF-8, en de rares cas, utiliser les mb_. Seulement, strtr a été donnée en tant que remplacement pour accents en ignorant sa définition-même. D'où l'explication du utf8_decode/encode, car ISO-8859-1 ne doit plus être utilisé sur le web.


a écrit :
PHP 6 a été abandonné il y a presque 2 ans.

A cause de la difficulté à tout passer en unicode. C'est bien ce que je dis.
Lpu8er a écrit :
Un peu réducteur. La grande majorité des str_ fonctionnent.


str_* oui, str* non

Lpu8er a écrit :
A cause de la difficulté à tout passer en unicode. C'est bien ce que je dis.


En fait c'est plutôt pour des raisons de désaccords entre les développeurs de PHP. Le support d'UNICODE était quasiment achevé quand le projet a été abandonné. Tu auras plus d'infos sur le blog de Frédéric Hardy si le sujet t’intéresse.
Modifié par jb_gfx (08 Sep 2011 - 11:26)
Salut,
Lpu8er a écrit :
A cause de la difficulté à tout passer en unicode. C'est bien ce que je dis.

jb_gfx a écrit :

En fait c'est plutôt pour des raisons de désaccords entre les développeurs de PHP. Le support d'UNICODE était terminé a plus de 90% quand le projet a été abandonné.

Surtout quand on sait qu'un fork PHP a vu le jour et qu'il prend en charge l'UTF-8 par défaut (développé par un seul bonhomme) :
http://www.xarg.org/2011/06/php-hacking/
D'accord... Mais sinon aucune idée sur le comment résoudre mon problème, quitte à trouver une alternative (même si je déteste méchamment ce qui ne marche pas quand aucune explication ne l'explique...) ??? Smiley sweatdrop
Si ça ne fonctionne pas, c'est forcément un problème d'encodage des caractères, puisque cette fonction ne traite pas correctement les chaines encodées en UTF-8. Sans données supplémentaires de ta part (code PHP exact, page en ligne, provenance de tes données, différents niveaux d'encodage (fichier, document, serveur, base de données, etc), etc), on ne peut pas faire grand chose.
Ben le code PHP exact je l'ai laissé dans deux précédent posts... Le niveau d'encodage de ma page, je l'ai précisé aussi, c'est du ISO-8859-1. Comment puis-je connaître l'encodage du serveur (je rappelle que je suis chez OVH et que j'ai jamais dû le changer, donc ça doit être celui configuré par défaut). Pour la base de données, je viens de me rendre compte que paramètre MySQL connection collation était défini en utf8_unicode_ci, sachant que la chaine de caractère que j'essaye de traiter sort de la base de données, ca pourrait venir de ça ? J'ai essayé de changer pour latin1-swedish-ci, et aucun changement... Smiley rolleyes

De plus j'ai essayé d'appliquer le traitement sur une simple chaîne de caractère en dur, donc qui ne sort pas de la base de données, et en dehors d'un lien (j'ai cru à un moment donné qu'il encodait la chaine en URL avant de passer dans ma fonction...), et toujours aucun résultat ! J'avoue que je commence à m'arracher les cheveux là, surtout que si j'arrive pas retirer ces #@! d'accents, ma fonctionnalité finale ne marche pas... Smiley decu
Reprenons depuis le début :

Tu veux utiliser la fonction strtr() avec une chaine encodée en ISO-8859-1 ou en UTF-8 ? Es-tu sûr que l'encodage (quel qu'il soit) est respecté à tous les niveaux ?

Voici les différents niveaux à vérifier :
- Document HTML : balise meta ;
- Fichier : Enregistrement ANSI ou Windows 1252 selon les logiciels ;
- Serveur : Utilisation d'un header PHP, d'une configuration htaccess ou httpd.conf ;
Eventuellement le cas échant :
- Base de données : Collation correcte des champs ;
- Connexion à la base de données : Pour la communication entre la base de données et PHP, avec la fonction mysql_set_charset() (PHP >= 5.2.3) ou la requête SET NAMES "utf8"; juste après la connexion.
Je veux utiliser strtr() sur une chaîne de caractères qui a tout du ISO-8859-1.

Balise meta => ISO-8859-1 (la balise meta entière montrée plus haut dans ce topic)
Fichier : enregistrement par Dreamweaver (j'en sais pas plus...)
.htaccess => ajout de la directive AddDefaultCharset ISO-8859-1 en début de fichier
Base de données : latin1-swedish-ci mais pas important puisque comme je l'ai précisé, j'ai essayé avec un simple chaine de caractère en dur et ça ne fonctionne pas non plus...

A aucun moment donné je ne vois où il pourrait y avoir de l'UTF-8, ce qui m’amène à la conclusion que je commence sérieusement à me demander si c'est un problème d'encodage...
Ben écoute, je viens de faire un test, le tout ISO, et je n'ai aucun problème avec ta fonction.
Pages :