Alexandre
01/04/2003 à 08:39
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
01/04/2003 à 08:41
ps: l'euro ne s'affiche pas dans le message précédent, le truc bizarre c'est le symbole euro...
olivier101
01/04/2003 à 08:58
Ca serait pas ça le problème justement ? Quel est l'encodage d'origine de l'euro, etc ?
Alexandre
01/04/2003 à 09:08
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
01/04/2003 à 09:30
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
01/04/2003 à 09:36
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
01/04/2003 à 09:40
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
01/04/2003 à 09:59
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
01/04/2003 à 10:13
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
01/04/2003 à 10:14
PS: l'euro est directement mis dans la base comme ça : €
olivier101
01/04/2003 à 10:18
CITATION(Alexandre)
PS: l'euro est directement mis dans la base comme ça : €
ça ne nous dit pas son code
Alexandre
01/04/2003 à 10:24
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.
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.

Penduick ya du taf pour toi ! :j
je rigole mais je suis complètement largué dans votre charabia
olivier101
01/04/2003 à 10:42
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.

Ben tu récupères une chaine, il te suffit d'afficher le code des caractères de la chaine.
Alexandre
01/04/2003 à 10:51
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
01/04/2003 à 10:57
CODE
$str = "Ma chaine";
$char = $str{x};
print("Code=" . ord($char));
Alexandre
01/04/2003 à 11:10
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
01/04/2003 à 11:14
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
01/04/2003 à 15:11
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....
olivier101
01/04/2003 à 15:12
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!
je sais pas ce que je vais faire de tout ce que j'ai lu mais c'est bigrement interessant

bravo Alexandre et Olivier pour cette partie de rigolade
olivier101
01/04/2003 à 20:28
CITATION(jms)
bravo Alexandre et Olivier pour cette partie de rigolade


à ton service...
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.