2 votes

Comment forcer l'enregistrement d'un fichier avec l'encodage ISO-8859-1 au lieu de UTF-8 ?

Je dois pouvoir xml téléchargement de fichiers avec ISO-8859-1 (Je sais, que UTF-8 est bien meilleur, mais notre partenaire a des exigences strictes en matière d'encodage et nous ne pouvons pas le forcer à changer sa politique).

Fond du serveur :

  • Google Chrome 71.0.3578.98 (version officielle) (64 bits)
  • Ubuntu 16.04
  • nginx
  • php 7.2
  • Symfony 4.0.15

Le contrôleur renvoie une réponse avec le bon jeu de caractères :

return (new Response($xml->content(), Response::HTTP_CREATED, ['Content-Type' => $xml->contentType()]))
    ->setCharset($xml->charset());

Il semble parfaitement correct (au moins dans Chrome DevTools il y a un en-tête de réponse correct) :

enter image description here

Mais le problème est que le fichier stocké dans le système de fichiers avec UTF-8 l'encodage.

$ file --mime test.xml 
test.xml: application/xml; charset=utf-8

et le fichier XML a un rendu incorrect après son ouverture dans le navigateur :

<INSIGMA>
    <AktuarMed>
       <Person>
           <Name>Hans Müller</Name>
           <Surname>Müller</Surname>
           <Forename>Hans</Forename>
       </Person>
    </AktuarMed>
</INSIGMA>

Le nom de famille doit être Müller mais il s'affiche mal. Si je change l'encodage de ce fichier pour celui attendu, alors il s'affiche correctement :

$ iconv -f UTF-8 test.xml -t ISO-8859-1 > test.xml
$ file --mime test.xml 
test.xml: application/xml; charset=iso-8859-1

TL;DR : Donc la question est

Pourquoi ce fichier est stocké avec utf-8 si le serveur répond, cela signifie que ISO-8859-1 doit être utilisé ?

  • Est-ce que je dois envoyer des en-têtes supplémentaires pour forcer le téléchargement du fichier avec ISO-8859-1 charset ? ou
  • S'agit-il du comportement par défaut du navigateur ? ou
  • Est-ce un comportement par défaut du système d'exploitation ?

Comment attraper ce problème et à quelle étape dois-je trouver une solution ?

1voto

ycnix Points 309

Vous pouvez essayer ce qui suit :

  1. Créez le fichier xml qui doit servir de réponse au serveur dans gedit, dans "Enregistrer sous", sélectionnez le codage de caractères approprié (ISO-8859-1) en bas de la boîte de dialogue.
  2. Mettez le fichier dans nginx et rendez-le accessible (public) par une certaine URL (comme http://localhost/sample-response.xml ou autre chose).
  3. Accédez-y avec votre navigateur
  4. Assurez-vous qu'il est correct du côté client (après avoir enregistré avec le navigateur).
  5. Enregistrer le fichier xml téléchargeant (accédant) le journal des demandes-réponses (avec wireshark ou tcpflow ou autre) en tant que texte brut.
  6. Accédez maintenant à l'application php pour le fichier xml généré par votre application php et enregistrez son journal de demande-réponse comme à l'étape 5.
  7. Comparez les journaux de demande-réponse des étapes 5 et 6 avec un outil de comparaison de fichiers (meld, kdiff3 ou autre).

Après cela, vous verrez peut-être où est le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X