[RESOLU] Fichier XML en UTF-8 corrompu selon la méthode utilisée

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Fichier XML en UTF-8 corrompu selon la méthode utilisée

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par neufr » 20 juin 2013, 15:38

OK, tout fonctionne, je note le sujet comme résolu.

Un très grand merci à ceux qui m'ont répondu !!!

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par moogli » 20 juin 2013, 13:27

Ça dépend de ton code, mais au pif tu utilise un \n (saut de ligne unix) et tu attend un \r\n (saut de ligne MS) ?

Par contre ton code ne touche pas aux saut de ligne ;)

Sinon un str_replace doit le faire, pense a mettre les saut de ligne dans une chaîne a double quote ("\r\n" et pas '\r\n').


@+

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par neufr » 20 juin 2013, 08:05

Je crois que j'ai trouvé !!!

moogli, ton dernier message m'a fait comparer les différences binaires entre les 2 fichiers.
Le problème vient des différences de retours à la ligne windows/unix.
Les séquences de caractères 13-10 du fichier modèle sont converties par le caractère 13 uniquement sur le serveur.

Pensez-vous qu'un vulgaire str_replace est une solution propre pour convertir les 10 par 13-10 et solutionner définitivement mon problème ?

En tous cas merci pour le temps passé !!!!

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par moogli » 19 juin 2013, 21:53

une image c'est du binaire, ça peux être utilisé comme du texte. c'est d'ailleurs ce que tu fait avec le xml.

est ce que c'est bien dans des cdata ?

si tu ne nous montre pas exemple on peux pas trop t'aider.

c'est quoi les 3ko qui manque ?

suivant la taille cette différence peux être des caractères "invisible" genre espace tab etc.


@+

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par neufr » 19 juin 2013, 21:08

Merci moogli pour ces pistes...

J'ai suivi tes instructions et ça ne change rien : même échec.
Le fichier généré est tronqué, il passe de 329 ko à 326 ko.
Par contre, si je compare les 2 fichiers avec la commande DOS "fc" : fichiers identiques (sauf si je fais "fc /B" => DOS fait la différence binaire).

Pour expliquer mon objectif :
- Je pars de ce fichier modèle Word ->XML et contient des balises du genre @nomclient@, @prenomclient@....
- Mon script a pour but d'ouvrir ce modèle XML, et de remplacer ces "balises" par des champs de ma BD.
- L'utilisateur récupère le fichier et le rouvre dans Word pour le fourguer ensuite à un logiciel...
Tout cela marche très bien avec la méthode de stockage sur le serveur qui est malheureusement trop lourde.

Donc, je suis un peu "obligé" de partir de Word d'autant que ce fichier contient des images...

Autre piste : si mon scripte utilise ZipArchive::CREATE pour générer un zip à partir de mon fichier de sortie correct, le fichier contenu dans le zip devient mauvais...

D'où mon impression d'un problème d'encodage, avec php qui lirait mal une séquence de caractères dans le fichier...

A suivre !

Juste une question, moogli, un éditeur spécialisé XML peut gérer des images dans un XML ?

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par moogli » 19 juin 2013, 19:06

salut,


le content type n'est pas bon xml c'est du texte => text/xml


ob_clean n'est utile que si tu utilise la bufferisation de sortie avant
à la limite ob_end_clean

Flush : le pire de tout s'il y a un truc dans le tampon c'est envoyé au navigateur, tu risque des soucis la :)

quand tu dit corrumpu; c'est qu'il manque quelque chose ?
il y a des chose anormale ?

pour info word c'est pas vraiment un editeur xml :mrgreen: , un editeur de texte simple peux faire mieux (simplement pour éviter les problèmes de caractère invisible parfois ajouté).


@+

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par neufr » 19 juin 2013, 09:58

Merci pour ta réponse, Mazarini.

J'ai mis en tête de script :
ini_set('default_charset', 'UTF-8');
et ça n'a rien changé.

Ensuite, j'ai testé avec readfile selon l'exemple de la doc php.net :
if (file_exists($fichier_entree)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($fichier_entree));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($fichier_entree));
    ob_clean();
    flush();
    readfile($fichier_entree);
    exit;
}
... et mon fichier de sortie est corrompu !

C'est à s'arracher les cheveux.
Je précise que ce fichier xml a été créé avec Word 2007 et qu'il contient des images.

Le but est de le modifier pour faire un mailing à partir d'une base de données.

Re: Fichier XML en UTF-8 corrompu selon la méthode utilisée

par Mazarini » 19 juin 2013, 09:17

Eventuellement tu peux essayer de mettre ini_set('default_charset', 'UTF-8'); avant la lecture du fichier (sans garantie).

Il est possible d'utiliser readfile() pour lire le fichier et l'envoyer au navigateur sans passer par une chaine de caractères.

Fichier XML en UTF-8 corrompu selon la méthode utilisée

par neufr » 19 juin 2013, 00:15

Bonsoir à toutes et à tous,

après 2 jours de recherches infructueuses, je m'en remets à votre savoir. C'est rare que je cale, mais là....

Mon problème est tout simple :
- j'ai un fichier modèle xml, codé en UTF-8, stocké sur mon serveur.

- le but de mon script est d'ouvrir ce fichier, y apporter des modifications, et le restituer à l'utilisateur.
$fichier_entree = "modele.xml";
$fichier_sortie = "sortie.xml";

$texte = file_get_contents($fichier_entree);

// ici les modifs que j'apporte, mais zappons-les

$fp = fopen ($fichier_sortie, "w+");
fwrite($fp,$texte);
fclose ($fp);
Ca c'est la solution de dépannage qui fonctionne et l'utilisateur peut récupérer son fichier xml en FTP, mais cela m'oblige à stocker le fichier sortie.xml sur le serveur.

Je voudrais, en utilisant header, que le fichier soit automatiquement récupéré par l'utilisateur :
$fichier_entree = "modele.xml";
$fichier_sortie = "sortie.xml";

$texte = file_get_contents($fichier_entree);

// ici les modifs que j'apporte, mais zappons-les

ini_set('default_charset', 'UTF-8');
header("Content-Disposition: attachment;filename=$fichier_sortie");
header("Content-Type: application/octet-stream");

echo $texte;
Ca fonctionne en local sous Windows, mais pas sur mon serveur en php 5.2.11 dédié chez Hosteur.
Le fichier est tronqué : 326 ko au lieu de 329 ko.
Le but est de l'ouvrir sous word qui plante à l'ouverture.

Je soupçonne fortement un problème d'encodage, mais je ne trouve pas...

Merci de m'avoir lu, votre aide est la bienvenue !

Olivier.