Aller au contenu

Pb d'encodage :(


Sujets conseillés

Posté

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 !

Posté

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 ?

Posté

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

 

 

 

 

Posté

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

 

Posté

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

Posté

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

 

 

Posté

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

Œ

 

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

 

Posté

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

 

Posté

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...