Une Bevue
2010-11-16 18:02:53 UTC
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...
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)
« Un nain a beau se tenir sur une montagne,
il n'en est pas plus grand pour cela. »
(Sénèque)