Aide - Recherche - Membres - Calendrier
Version complète : petit problème en PHP
Les Forums de PalmAttitude.org > HORS-SUJET > Divers (non PalmOS)
Alexandre
Bonjour,

Je dois créer un fichier XML à partir de données provenant d'une BD. Cependant, quand la fonction dumpfile() s'execute, elle me dit que "Input not in UTF-8". J'utilise donc utf8_encode pour résoudre le problème, et bizaremment, tout mes caractères spéciaux comme € (euro) par exemple ne marche plus. J'ai cherché partout mais je ne comprends pas comment résoudre ce problème.

Voici un bout de code php qui fait exactement ce que je décris.

CODE
<?php

// Avec Dump File

$doc=domxml_new_doc("1.0");

$root = $doc->add_root("Pere");

$root->new_child("fils",utf8_encode("€"));

$doc->dump_file("./eurotest.xml", false, true);



// Avec Dump Mem

$doc2=domxml_new_doc("1.0");

$root = $doc2->add_root("Pere");

$root->new_child("fils","€");

echo $doc2->dump_mem("2","UTF-8");

$fp = fopen("eurotest2.xml","w");

fwrite($fp, $doc->dump_mem(2,"UTF-8"));

?>


Si vous avez une idée, je vous en remercie.
Alexandre
ps: l'euro ne s'affiche pas dans le message précédent, le truc bizarre c'est le symbole euro...
olivier101
Ca serait pas ça le problème justement ? Quel est l'encodage d'origine de l'euro, etc ?
Alexandre
En fait, L'euro n'existe pas dans la table ISO-8859-1 (latin-1) c'est pour cela qu'il existe une table ISO-8859-15, mais pour des applis commerciales il convient d'utiliser UNICODE UTF-8. Je pense que ça vient du fait que Windows utilise un encodage spécial WINDOWS-1252, et que la correspondance entre le code hexa (ou décimal) du symbole euro n'est pas la même....
olivier101
Eh oui, d'après la doc utf8_encode convertit une chaine iso-8859-1 en UTF-8. Si au départ tu n'as pas de l'iso-8859-1, les résultats sont imprévisibles.
Alexandre
je suis d'accord avec toi, alors voilà, en entrée j'ai du ASCII, selon mb_detect_encoding, et quand je le convertis en UTF8 avec mb_convert_encoding, ça donne rien. Par contre si je marque le symbole Euro sous forme "€" au lieu de le prendre dans ma variable, et que je fais un mb_convert_encoding d'WINDOWS-1252 en UTF-8, là ça marche.

Ce qu'il me faudrait, c'est convertir les caractères en leur équivalent héxa ou décimal : 갠 par exemple pour euro... mais ça me dépasse.
Alexandre
je sius même pas sûr d'avoir de l'ASCII en entrée, je crois que je me perds un peu....désolé...
olivier101
En effet ça ne peut pas être de l'ASCII, puisque l'ASCII ne contient pas de caractères accentués et certainement pas le symbole euro...

Ce qu'il faut savoir c'est quel est l'encodage d'origine... d'où elle vient ta variable, de la base de données ok, mais qui l'a remplie? quel est le code de l'euro dans la base? comme ça on pourra peut-être déduire l'encodage...

Il faut bien comprende que le code hexa d'un caractère n'a de sens que pour un encodage donné.
Alexandre
je vais le chercher dans la BD, c'est mysql, elle s'y trouve bien, mais je ne sais pas quel est l'encodage de sortie qu'on on fait une requête sur cette base, je sais pas où c'est marqué?
Alexandre
PS: l'euro est directement mis dans la base comme ça : €
olivier101
CITATION(Alexandre)
PS: l'euro est directement mis dans la base comme ça : €

ça ne nous dit pas son code sleep.gif
Alexandre
je ne sais pas comment on fait pour savoir qu'elle est l'encodage d'un bd mysql, ou du résultat de requêtes qu'on fait dessus avec php. icon_bla.gif
jms
CITATION(Alexandre)
je ne sais pas comment on fait pour savoir qu'elle est l'encodage d'un bd mysql, ou du résultat de requêtes qu'on fait dessus avec php. icon_bla.gif
Penduick ya du taf pour toi ! :j je rigole mais je suis complètement largué dans votre charabia
olivier101
CITATION(Alexandre)
je ne sais pas comment on fait pour savoir qu'elle est l'encodage d'un bd mysql, ou du résultat de requêtes qu'on fait dessus avec php. icon_bla.gif
Ben tu récupères une chaine, il te suffit d'afficher le code des caractères de la chaine.
Alexandre
CITATION(olivier101)
Ben tu récupères une chaine, il te suffit d'afficher le code des caractères de la chaine.


Comment ? en php ou autre...
olivier101
CODE
$str = "Ma chaine";

$char = $str{x};

print("Code=" . ord($char));
Alexandre
j'obtiens 48, cependant il n'y a plus le symbole € dans ma chaine il y a 0 et dans une autre il y a ?.

8O

et si je mets Euro directement "€", j'obtiens 128

mais ord ne renvoie t'il pas que le code ASCII ?
Alexandre
en fait il y a bien Euro dans ma chaine mais quand je visualise il faut que je mette IE à Europe Occidentale (Windows), et quand je fais ce que tu m'as dit avec cette chaîne sur le caractère euro j'obtiens 128.
Alexandre
Le problème est résolu :P , merci à Olivier pour sa participation, en fait le codage était WINDOWS-1252.


PS: Merci aussi à JMS pour sa bonne humeur.... anim_wink.gif
olivier101
ord renvoie le code (ordinal) du premier caractère de la chaîne qu tu lui passes, il se fout de savoir si c'est ASCII ou ISO ou UTF-8
Ce qu'il faut savoir, c'est quel est le code (ordinal) de ce fameux caractère dans la chaîne qui t'es renvoyée par la DB !

48 c'est le code du caractère "0" en ASCII et dans tous les autres surensembles d'ASCII (comme ISO-8859-x)

128 est effectivement le code de l'euro en encodage Windows (WINDOWS-1252 = europe occidentale), donc la conversion devrait marcher, que ce soit toi qui le tape ou bien que ça vienne de la DB !

PS: je vois que c'et résolu, tant mieux!
jms
je sais pas ce que je vais faire de tout ce que j'ai lu mais c'est bigrement interessant icon_lol2.gif bravo Alexandre et Olivier pour cette partie de rigolade anim_wink.gif
olivier101
CITATION(jms)
  bravo Alexandre et Olivier pour cette partie de rigolade  anim_wink.gif

icon_lol2.gif à ton service... sleep.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.