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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
Le 16/11/2010 19:02, Une Bevue a écrit :
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>.
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 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
Le 16/11/2010 19:02, Une Bevue a écrit :
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>.
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 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.
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>.
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 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.