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.
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. –
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