Jump to content

Pb d'encodage :(


Recommended Posts

Posted

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 !

Posted

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 ?

Posted

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

 

 

 

 

Posted

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

 

Posted

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

Posted

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

 

 

Posted

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

Œ

 

Posted
<?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é ?

 

Posted

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

 

Posted

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

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...