Bonsoir,
j'ai un problème qui commence à me rendre cinglé et j'aimerais bien un coup de main.
Je veux tout simplement lire un fichier (qui dans la pratique peut avoir plusieurs formats...txt, csv etc etc.
Je n'ai aucun problème à lire les caractères normaux, mais pour les caractères spéciaux style é è à et les autres c'est un véritable bordel.
Si j'ouvre le fichier en ANSI ou Latin1, alors je vois les accents (ce qui est plutôt bon signe^^)
Sauf que, je me suis rendu compte que je ne récupérais pas les bonnes valeurs car ce que je lis dans le fichier je le fais traduire par l'api de google.
Et pour la même phrase encodé dans la page correctement en utf8 et celle lu dans le fichier, j'ai deux traductions différentes avec des caractères qui sautent notamment.
Mon problème n'est donc pas d'afficher des caractères en utf8 sur la page. Mais bien de récupérer le caractère réel lorsque je lis un fichier.
Si je lis "à" je veux retourner "à"; ou éventuellement même "a" sans accent pour éviter de futurs problèmes.
Mais tout ce que j'ai tenté est resté sans succès.
Voici la fonction que j'utilise pour garder le bon caractère, mais qui semble ne pas être très efficace...elle ne doit rien faire aux caractères normaux et modifier les autres.
L'idée étant que j'ai remarqué que tous les char spéciaux commençaient par le même code ascii 195. Lorsque je repère ce code je retourne une chaine vide, et par la suite je regarde le code suivant qui me donnera le bon caractère lors du prochain appel de la fonction avec le caractère suivant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 //prend un caractère et le retourne sans accent. function transcode($s){ $c=ord($s); if($c==195){ //si accent on renvoit chaine vide et on affiche en fonction du caaractère suivant return ""; } if($c==160 || $c==161 ||$c==162 || $c==163 || $c==164 ||$c==165 || $c==166){ return "a"; }if($c==168 || $c==169 || $c==170 || $c==171){ return "e"; }if($c==172 || $c==173 || $c==174 || $c==175){ return "i"; }if($c==185 || $c==186 || $c==187 || $c==188){ return "u"; }if($c==178 || $c==179 || $c==180 || $c==181 || $c==182){ return "o"; }if($c==167){ return "c"; }else{ //si char différent, on le renvoie sans modification return $s; } }
Sur le papier l'algo m'a l'air bon, dans la pratique je n'ai pas de meilleurs résultats...
Pour vous donner une idée plus précise, si j'affecte une variable php et que je la fais traduire par l'appli disons que je veuille traduire
J'ai été salué --> L'appli va me renvoyer I was greeted ce qui est normal.
Si je lis J'ai été salué dans un fichier, je vais obtenir " I t salu "
Pourquoi ce résultat, parce que en réalité, il n'a pas su lire les accents. Du coup j'ai envoyé à l'appli; "J'ai t salu" et il n'a logiquement su traduire que le premier mot vu que les deux autres n'existent pas.
Je précise bien également que le problème est de pouvoir faire face à n'importe quel type de fichier en entrée, car je ne peut pas connaître l'encodage à l'avance...
Dans l'idéal, je voudrais une fonction comme celle que j'ai tenté qui puisse convertir tous les caractères spéciaux en leur enlevant leur accent (ou bien en le gardant mais correctement).
Pour un exemple complet parlant, j'ai un fichier f1 en entrée avec
A1 ou A1 est une cellule à traduire.
J'écris en sortie un fichier f2 qui contient A1 B1 avec B1 la traduction de A1.
A l'heure actuelle je vois bien mes accents s'écrire dans f2 donc c'est que je dois bien les lire correctement pourtant...; mais derrière la traduction me prouve que je n'envoie pas la bonne chaine à l'api. Ce qui m'énerve aussi c'est que normalement avec la fonction que j'utilise je devrais supprimer les accents, hors je les vois toujours et donc cela implique que ma fonction ne fait rien (ou passe toujours dans le else); et que, par conséquent on retombe encore sur une merdouille d'encodage que je ne vois pas...
Un coup de main serait le bienvenue, je sature x)
Merci à vous !
Partager