Discussion:
probleme avec desaccentuation
(trop ancien pour répondre)
Une Bevue
2010-11-16 18:02:53 UTC
Permalink
j'ai besoin de convertir une string accentuée en string non accentuée.

pour cela j'utilise un script modifié et trouvé sur :
<http://stackoverflow.com/questions/2758736/multibyte-strtr-mb-strtr>

qui marche bien lors d'essais où les strings sont entrées dans le script
lui-même, par contre, si la string provient d'un $dir->read() (sur Mac
OS X SL) j'ai quelquefois, mais pas toujours des problèmes par exemple
"Pyrénées" est vu comme "Pyre ne es", ce qui "casse le mot...

je pense que comme l'UTF-8 MAc OS X SL est "spécial" c'est le problème ?

la function en question :

function unaccent_alphabetical($string) {

// suppression de l'extension
$pos=strrpos($string,".");
if (!$pos) {
$pos=strlen($string);
}
$string=substr($string,0,$pos);

// remplace toutes les lettres diacritiques par des non-diacritiques,
par ex ç -> c, é -> e etc...
// remplace tout ce qui n'est pas alphabétique ([^a-zA-Z]) par une
espace
// supprime tous les blancs boubles, initiaux ou finaux ;
$string=preg_replace('/^\s?(.*)([a-zA-Z]+)\s?$/','$1$2',preg_replace('/\
s\s+/',' ',preg_replace('/[^a-zA-Z]/','
',html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|gra
ve|lig|orn|ring|slash|th|tilde|uml);~i','$1',htmlentities($string,
ENT_QUOTES, 'UTF-8')),ENT_QUOTES,'ASCII'))));

// changement de casse => tout en lower case
return
strtr($string,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')
;
}


donc, avec le fichier de nom "Tourte des Pyrénées.pdf"
s'il est entré dans mon script par :
$string='Tourte des Pyrénées.pdf';

j'obtiens le résultat espéré (par unaccent_alphabetical($string)) :
"tourte des pyrenees"

tandis que si la string est obtenue par while (false !== ($entry =
$dir->read())) { ...

j'obtiens (par unaccent_alphabetical($entry)) :
"tourte des pyre ne es"

ce qui casse le nom...
--
« Un nain a beau se tenir sur une montagne,
il n'en est pas plus grand pour cela. »
(Sénèque)
Olivier Miakinen
2010-11-16 18:35:45 UTC
Permalink
Post by Une Bevue
j'ai besoin de convertir une string accentuée en string non accentuée.
En principe, iconv devrait pouvoir le faire en une ligne (je suppose que
l'encodage de départ est UTF-8) :
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

Mais apparemment ça ne fonctionne que si tu fais au début de ton script
un setlocale() autre que 'C' ou 'POSIX'.

Pour en savoir plus, regarde tous les commentaires de la page
<http://fr.php.net/manual/fr/function.iconv.php> qui contiennent la
chaîne « ASCII ».

En particulier : <http://fr.php.net/manual/fr/function.iconv.php#74101>.
Post by Une Bevue
<http://stackoverflow.com/questions/2758736/multibyte-strtr-mb-strtr>
qui marche bien lors d'essais où les strings sont entrées dans le script
lui-même, par contre, si la string provient d'un $dir->read() (sur Mac
OS X SL) j'ai quelquefois, mais pas toujours des problèmes par exemple
"Pyrénées" est vu comme "Pyre ne es", ce qui "casse le mot...
Je parie que c'est la différence entre un « é » précomposé et une
séquence « e » + « accent aigu ». Je pense que iconv devrait gérer
ça correctement (pourvu que tu fasses gaffe à la locale).

Pour tester, voici un mot dont -- si SeaMonkey les laisse tranquille --
le premier é est précomposé et le second est en deux caractères :
« Pyrénées ».

Si jamais ça ne fonctionnait pas (par exemple tu n'as aucune chance en
le lisant avec MacSOUP), va sur la page suivante :
http://people.w3.org/rishida/scripts/uniview.fr/conversion.html
puis copie-colle le texte ci-dessous dans la zone en haut à gauche :
50 79 72 E9 6E 65 301 65 73
et enfin clique dans la fenêtre en haut à droite pour y trouver le mot
à tester.

Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...