Jump to content
lorik

Pb d'encodage :(

Rate this topic

Recommended Posts

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 !

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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. ;)

 

 

 

 

Share this post


Link to post
Share on other sites

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 !  :)

 

Share this post


Link to post
Share on other sites

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('&#140;','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).

Share this post


Link to post
Share on other sites

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 :?:

 

 

Share this post


Link to post
Share on other sites

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

Œ

 

Share this post


Link to post
Share on other sites
<?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é ?

 

Share this post


Link to post
Share on other sites

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...
 

 

Share this post


Link to post
Share on other sites
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...

Share this post


Link to post
Share on other sites

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é !

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...