Fonction pour "désaccentuer" ?

Zax
Eléphanteau du PHP | 22 Messages

13 juil. 2009, 10:14

Bonjour,

Je me trouve confronté à des problèmes de caractères accentués à 2 niveaux :
1 - retour SQL -> PHP5 -> AJAX -> alert JS
2 - tri alpha d'un array en PHP 5 : "énergumène" se retrouve après "zoulou" :(

J'ai donc essayé d'écrire une fonction PHP qui transforme les caractères accentués les plus courants en caractères non accentués en prenant des bouts de ci de là. Cette fonction doit "marcher" quel que soit la chaine passée : dans mon cas, ISO venant d'une base SQL, ou UTF-8 venant d'une variable PHP. Je sais que c'est le bazar mais je ne peux pas normaliser le format reçu.

Ca donne :
function sansAccent($chaine) {
	// renvoit la chaine passee sans accent
	$accents = '/&([A-Za-z]{1,2})(grave|acute|circ|cedil|uml|lig);/';
	if (strlen(htmlentities($chaine,ENT_COMPAT,'UTF-8')) == 0) {
		// $chaine en ISO-8859-1
		return preg_replace($accents,'$1',htmlentities($chaine));
	}else{
		// $chaine en UTF-8
		return preg_replace($accents,'$1',htmlentities($chaine,ENT_COMPAT,'UTF-8'));
	}
}
J'ai l'impression que c'est du bricolage :(
Vous en pensez quoi ? Quelqu'un connait une fonction plus propre ?

Merci d'avance.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

13 juil. 2009, 10:44

Bonjour,

Moi j'utilise un truc du genre ci-dessous et ça marche plutôt bien à condition de faire un html_entity_decode() avant, pour éviter les caractères encodés HTML.
function suppr_accent($texte) {
     $accent='ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ';
     $noaccent='AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn'; 
     $texte = strtr($texte,$accent,$noaccent); 
     return $texte;
}
Sinon regarde dans les commentaire de la fonction strtr(), il y a un paquet d'exemples de fonctions pour retirer les accents :)

##edit : Si vous travaillez en UTF8, et que le code ci-dessus ne fonctionne pas, essayez celui-ci :
function suppr_accent($texte) {
    $accent='ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËéèêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ';
    $noaccent='AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn';
    $texte = strtr($texte,utf8_decode($accent),$noaccent);
    return $texte;
}
Quand tout le reste a échoué, lisez le mode d'emploi...

Zax
Eléphanteau du PHP | 22 Messages

13 juil. 2009, 11:01

Je crois avoir testé une fonction comme "suppr_accent" mais elle ne fonctionne pas dans un de mes 2 cas (source SQL ou source PHP, me souviens plus).

En y repensant, mon problème peut aussi se poser de la manière suivante : est-il possible de connaitre en PHP et au moment de traiter une chaine l'encodage de celle-ci ?

Mammouth du PHP | 2937 Messages

13 juil. 2009, 11:17

Il y a aussi la fonction iconv(), dont le deuxième argument permet d'ajouter au codage de sortie la chaîne //TRANSLIT, ainsi que la chaîne //IGNORE pour éviter que la conversion ne s'arrête prématurément en cas de problème de conversion d'un caractère spécial. ;)

Mammouth du PHP | 693 Messages

13 juil. 2009, 11:49

Pour voir si une chaine est encrypté sous une certaine forme, tu peux utiliser en cascade la fonction de décryptage et d'encryptage que tu compare à la chaine d'origine. Si la chaine d'origine est bien encrypté sous cette forme, il y aura égalité et inégalité dans les autres cas.

Zax
Eléphanteau du PHP | 22 Messages

16 juil. 2009, 08:29

Merci pour vos réponses.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 juil. 2009, 11:29

Modération :
Zax, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...