2012-03-16 5 views
2

J'ai écrit un petit script PHP qui fait un "branding" sur un fichier PDF présent. Cela signifie que sur chaque page je mets une chaîne comme "appartient à" à un poste spécial. Pour cela, j'utilise Zend_Pdf hors du Zend Framework. Parce que le script est utilisé dans la zone de langue allemande, j'utilise dans une ligne le caractère spécial "ö" ("Gehört zu").PHP: rupture de chaîne au caractère spécial

Sur mon ordinateur local (Windows, XAMPP), le script fonctionnait correctement, mais lorsque je le déplaçais sur l'espace web de mon hébergeur (un peu de Linux), la chaîne casse à "ö". Cela signifie que dans mon PDF apparaît "Geh".

Le code est la suivante:

 if (substr($file, strlen($file) - 4) === '.pdf') { 
      $name = $user->GetName; 
      $fontSize = 12; 
      $xTextPos = 100; 
      $yTextPos = 10; 

      set_include_path(dirname(__FILE__)); // set include_path for external library Zend Framework 
      require_once('Zend' .DS . 'Pdf.php'); 
      $pdf = Zend_Pdf::load($file); 
      $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA); 

      $branding = 'Gehört zu ' . $name; // German for: 'Belongs to ', problem with 'ö' 

      foreach ($pdf->pages as &$page) { 
       $page->setFont($font, $fontSize); 
       $page->drawText($branding, $xTextPos, $yTextPos); 
      } 
     } 

Je suppose que le problème est lié à une sorte de mise en jeu de caractères ou de la langue par défaut de l'environnement PHP. Donc, je cherchais ici et essayé:

  $branding = utf8_encode('Gehört zu ') . $name; 

... et j'ai fait quelques expériences avec des fonctions comme html_entity_decode mais rien aidé et moi avons décidé arrêter à tâtons dans l'obscurité et ouvrir une propre question.

Dans l'attente de tous les conseils. Merci d'avance pour votre aide!

EDIT: Pendant ce temps j'ai trouvé le même problème (?), solved on a German forum. Mais si je le fais comme ils disent ...

   $branding = mb_convert_encoding('Gehört zu ', 'ISO-8859-1') . $name; 

... la marque résultant dans le PDF est « Gehrt zu ». Le "ö" est ignoré maintenant.

Pour cela, j'ai trouvé another hint on the Zend issue tracker. Je résume, que je peux abandonner toutes les choses UTF8 et concentrer sur Latin-1 AKA ISO 8859-1.

Je ne comprends toujours pas pourquoi le code a fonctionné sur mon Windows + XAMPP et se bloque maintenant sur Linux de mon hébergeur.

Répondre

2

Votre estimation est exacte, le problème est lié à l'encodage. Où exactement l'encodage est foiré est difficile à dire de loin. Je suppose que vous travaillez non seulement avec Zend_Pdf, mais aussi avec le MVC en place (ce qui signifie un Zend_Application complet).

Vous devez vérifier si votre application fournit des pages au format UTF-8, en définissant:

resources.view.encoding = "UTF-8" 

et en plaçant également les méta-balises appropriées dans votre mise en page/vue. En fonction de l'éditeur que vous utilisez, vos fichiers peuvent être codés dans un encodage différent. Vous pouvez utiliser Notepad ++ sur Windows pour vérifier votre encodage de fichier et pour le convertir en UTF-8 (ne pas simplement définir l'encodage en UTF-8, cela pourrait gâcher votre fichier!) Si nécessaire. Je recommande d'utiliser Eclipse avec l'encodage de fichier texte défini sur "UTF-8" (Préférences> Général> Espace de travail) pour vous assurer que vos fichiers de code sont codés en UTF-8.

Maintenant vient la partie cruciale:

Zend_Pdf_Page::drawText(string $text, float $x, float $y, string $charEncoding) 

Voir ce dernier argument ... régler. Si vous êtes chanceux, vous pouvez ignorer les éléments précédents et simplement définir l'encodage.

edit: J'ai raté quelque chose. Connexions de base de données Vous devriez vérifier l'encodage là aussi. Je travaille fréquemment avec MS SQL Server, qui utilise Latin-1 en interne; ne pas mettre driver_otpions.CharacterSet peut gâcher des choses assez mal aussi. Cela pourrait être pertinent, si vous avez quelque chose comme Gehört zu: Günther, où le nom Günther est récupéré à partir de DB.

+0

J'ai vérifié l'encodage avec Notepad ++ et c'est ANSI partout. Je ne comprends pas pourquoi tout fonctionne sur mon installation XAMPP, mais pas sur l'espace web qui tourne sous Linux. –

+1

Pour cette raison, je suis plutôt méticuleux en ce qui concerne l'encodage (voir aussi le post de Padráic Brady sur les vulnérabilités XSS pour d'autres raisons). Le seul conseil que je peux donner est, assurez-vous que vous utilisez toujours le même encodage, que ce soit le codage de fichiers de notre sortie/entrée de votre application. Si vous voulez juste un hack rapide. Créez un pdf-doc vide et placez un test statique en utilisant 'drawText()' avec utf8_encode/decode iconv et $ charEncoding défini sur les valeurs attendues (par exemple une avec iso-8859-1 et une avec utf-8). – dbrumann

0

L'encodage dépend également du codage du fichier. Si vous codez votre fichier dans UTF8 par exemple et que vous utilisez ut8_encode ("ö"), alors vous encoderez dans UTF_8 quelque chose déjà dans UTF_8.

Ainsi, vous voudrez peut-être vérifier ce qu'est votre encodage de fichier, et ce que votre bibliothèque PDF nécessite. Ensuite, appliquez la bonne formule/transformation.

+0

J'ai utilisé Notepad ++ qui me dit que mon encodage de fichier était en ANSI et que Zend_Pdf l'est aussi. Je l'ai changé pour tester en UTF8 et ajouté la fonction utf8_encode avant le "Gehört zu", mais le problème consiste. –

Questions connexes