lorik Posté 14 Août 2019 Posté 14 Août 2019 Hello les pros, besoin encore d'un ti coup de main sur un problème d'encodage qui me rend fou ! J'ai de la data (texte) dans une table, importée sous mysql à partir d'un csv en utf-8. Dedans, j'ai des textes genre 'Œuilly', que je cherche à transformer en 'OEUILLY '. Le probleme, vous vous doutez, c'est le Œ... J'ai un peu tout essayé.. un utf8-encode supprime carrement le Œ... un mb_strtolower le met en bouillie ingèrable. Et j'ai besoin de ces 2 instructions pour gérer par ailleurs sur d'autres textes des majuscules accentuées... Bref, je sèche completement ;( Une idée ? par avance merci !
Dudu Posté 14 Août 2019 Posté 14 Août 2019 Salut Œ est un caractère en lui-même. E, O et Œ sont donc trois caractères différents, et donc leur représentation informatique est différente quelque soit le jeu d’encodage. Ça m’étonnerait beaucoup qu’une fonction PHP puisse changer la lettre Œ en la suite de 2 lettres O et E. Eventuellement un petit script moulinette qui ferait du rechercher/remplacer, au pire, mais avec la lourdeur de code que cela implique. D’ailleurs, pourquoi vouloir modifier ce pauvre Œ ? Si je comprends bien, il y a une histoire de capitales accentuées, mais ce n’est pas une raison pour éradiquer un caractère, non ?
Dan Posté 15 Août 2019 Posté 15 Août 2019 Hello, Avec Transliterator::transliterate c'est simple (si php est compilé avec intl et que la bibliothèque ICU est installée) ! https://www.php.net/manual/fr/class.transliterator.php <?php var_dump(transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', "A æ Übérmensch på høyeste nivå! И я люблю PHP! fi")); // string(41) "a ae ubermensch pa hoyeste niva! i a lublu php! fi" ?> fonctionne bien chez moi avec php 7.3 sauf que la longueur retournée pour la chaîne est plus logiquement de 50 au lieu de 41.
Dan Posté 15 Août 2019 Posté 15 Août 2019 En lançant ceci qui exécute la fonction transliterator_transliterate 1000 fois <?php $start=microtime(true); for ($i=0;$i<1000;$i++) $j=transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', "A æ Übérmensch på høyeste nivå! И я люблю PHP! fi"); $elapsed = microtime(true) - $start; print $j ."\n".$elapsed ." seconds\n"; ?> on obtient une idée du temps d'exécution : a ae ubermensch pa hoyeste niva! i a lublu php! fi 0.19594597816467 seconds Moins de deux dixièmes de seconde pour 1000 exécutions, on ne peut pas dire que c'est trop lent Pour info, la phrase testée est reprise de l'exemple fourni sur le site php.net. Elle commence en luxembourgeois, continue en norvégien et se termine en russe ! Traduite, elle veut dire : "Un superman au plus haut niveau ! Et j'adore le PHP !" Merci Google Translate !
lorik Posté 16 Août 2019 Auteur Posté 16 Août 2019 Hello les pros, merci du coup de main. Dan : echo (transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', 'Œuilly')); => marche parfaitement. Problème echo (transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', '$ressort_villes')); // $ressort_villes contient le texte extrait de mysql => vide la variable (Ya bien du texte dans la variable à la base ! à l'affichage, on voit ça http://prntscr.com/otdljs) Et toujours plus bizarre, si je fais : $ressort_villes=utf8_encode($ressort_villes); $ressort_villes=transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $ressort_villes); Je me retrouve avec une requete d'insert avec un carractere mal encodé : http://prntscr.com/otdvg6, mais dans mysql, j'ai " ÂŒuilly " http://prntscr.com/otdy63 inséré. Bref, à la base, AVANT le transliterator_transliterate j'ai un problème d'encodage quelque part, je patauge systématiquement sur ces trucs là Dudu : j'ai essayé des str_replace, sur la chaine en Maj ou en Min, avant et après l'utf8_encode sans effet, hélas... Même avec le code ascii, aucun résultat $ressort_villes=str_replace('Œ','XXXXX', $ressort_villes); Et j'ai vraiment besoin de trasnformer ça, je dois au final comparer des chaines issues de sources différentes, et de l'autre coté, c'est bien écrit 'OE', donc je doit uniformiser (et dans ce sens, là, il y a plein d'autres uniformisations à faire, qui ne peuvent se faire que comme ça et sont OK).
Dan Posté 16 Août 2019 Posté 16 Août 2019 Pour quelle raison mets-tu $ressort_villes entre simple quotes dans ton premier exemple ??? Les simples quotes empêchent la résolution de la variable. Donc c'est soit des doubles-quotes, soit rien ! Ceci fonctionne bien et ne modifie nullement $chaine : $chaine='Œuilly'; echo(transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $chaine)); Tu peux remplacer "Lower" par "Upper" si tu veux OE au lieu de oe Pour le second exemple, tu commences par encoder en UTF8, puis tu translitères du "Any-Latin" à la ligne suivante ! A quoi sert ton encodage UTF-8
lorik Posté 16 Août 2019 Auteur Posté 16 Août 2019 Hello Dan, pour le premier point, c'est juste que je suis un boulet dans le post (et surement pas que...), mais j'ai bien $ressort_villes=transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $ressort_villes); Dans mon code, et ça vide bien la chaine., un strlen renvoi 0. Sinon, pour l'encodage utf-8 puis latin, bah justement, les encodages, je patauge totalement, donc j'ai juste ajouté ton code dans le mien, sans pour autant comprendre son fonctionnement.... Disons qu'a la base, pour pouvoir traiter (plein d'autres choses dans) la chaine, j'ai besoin de l'encoder utf-8, sinon, sinon d'autres caracteres spéciaux ne sont pas gérables. Ca fonctionne bien pour les autres caractères (des majuscules accentuées, pour être clair), par contre, inopérant pour ce fameux Œ
Dan Posté 16 Août 2019 Posté 16 Août 2019 <?php $ressort_villes='Œuilly'; $ressort_villes= transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $ressort_villes); print $ressort_villes."\n"; print strlen($ressort_villes); ?> Chez moi ça affiche bien la ville, et 7 pour le strlen() (qui est la longueur une fois translitéré ) ! Tu dois avoir une "couille dans le potage" dans ton code ! Un caractère caché ?
lorik Posté 16 Août 2019 Auteur Posté 16 Août 2019 Oui oui, c'est ce que je dis. il y a un problème, pas dans le code (ya 4 lignes !), mais dans la donnée de base, le texte extrait de mysql. C'est la dedans qu'il doit y avoir un Pb d'encodage quelque part, et du coup, le transliterator_transliterate ne renvoi rien (et strlen=0). aucune erreur Php, rien dans les logs. Juste ça renvoi vide... J'ai le test ici : https://landseeker.fr/api/test_encodage.php ton code marche bien, mais ça foire dès que j'utilise la chaine en base...
Dan Posté 16 Août 2019 Posté 16 Août 2019 il y a 4 minutes, lorik a dit : J'ai le test ici : https://landseeker.fr/api/test_encodage.php ton code marche bien, mais ça foire dès que j'utilise la chaine en base... N'ayant pas accès aux sources, je ne peux rien dire de plus...
lorik Posté 16 Août 2019 Auteur Posté 16 Août 2019 ALLELOUIA !!!! Il fallait ajouter un $ressort_villes=iconv( 'Windows-1252', 'UTF-8//TRANSLIT', $ressort_villes ); avant le lancer le transliterator... Et la, j'ai bien ce P... de Œ transformé en OE ! Bon, merci des tuyaux et du temps passé !
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant