IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Encodage UTF-8 mal encodé


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut Encodage UTF-8 mal encodé
    Bonsoir, je viens POST ici car je n'arrive pas à me défaire d'un problème d'encodage. Je cherche a générer un fichier PDF avec FPDF chose que j'ai déjà faite pas mal de fois auparavant. L'uniquement changement cette fois ci c'est que je le fait via CakePHP. Je sais que FPDF n'utilise pas (par défaut) l'encodage UTF-8 mais je n'ai jamais eu ce genre de problème jusque là...

    Bref côté controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    $this->response->type( 'pdf' );
    $this->layout = 'pdf';
     
    App::import( 'Vendor', 'Fpdf', array( 'file' => 'fpdf/fpdf.php' ) );
     
    $options = array(
    	'contain' 	=> array(
    		'Customer',
    		'Contact',
    		'User',
    		'RowQuote' => array(
    			'Article' => array(
    				'fields' => array( 'reference', 'type' ),
    				'TypeArticle'
    			)
    		)
    	),
    			'conditions' => array( 'Quote.id' => $id )
    );
    // debug( $this->Quote->find( 'first', $options ) );
    $this->set( 'data', $this->Quote->find( 'first', $options ) );
    Coté layout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
        header( "Content-type: application/pdf" ); 
        echo $content_for_layout;
    ?>
    et coté vue tout les traitements interne au pdf, le même d'ailleurs qu'un autre script qui tourne toujours sans encombre.

    j'ai essayé les fonctions habituelles encode et decode, ainsi que les methodes mb_ ou iconv afin de connaître les encodages de sorties et internes...

    rien y fait j'y arrive pas. J'ai toujours des caractères de ***** qui me retournent des FALSE ou des NULL lors des conversions ou decodage.

    Je suis épuisé et j'ai besoin de votre aide afin de régler le problème au plus vite. Je ne sais pas si ce qui est noté vous suffira mais je répondrais a toutes les questions afin de passer la difficulté.

    Merci d'avance.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    FPDF n'utilise pas (par défaut) l'encodage UTF-8
    Non, il ne l'utilise pas tout court.

    Il est sûr que la detection d'un encodage sur une chaine n'est pas fiable a l'excès.
    Donc soit tu connais de manière sure l'encodage de ton entrée et donc tu dois pouvoir la convertir, soit tu en es réduis à la deviner et donc tu auras parfois des ratés.
    De plus par définition tous les caractères UTF8 n'existe pas en ISO-8859-1, autre source de ratés.

    Est-ce que tu peux nous fournir une chaine que tu convertis mal par exemple (et nous dire comment tu fais ton décodage parce que c'est quand le même le point important et tu ne nous en dis rien).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    Concrètement je n'encode rien à la base, tout se fait automatiquement... Je récupère les infos d'une BDD interclassement latin1_swedish_ci dans mon contrôleur cakePHP, la configuration "database" de cakePHP est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public $default = array(
    	'datasource' => 'Database/Mysql',
    	'persistent' => false,
    	'host' => '******',
    	'login' => '*****',
    	'password' => '******',
    	'database' => 'rsgescom',
    	'prefix' => '',
    	'encoding' => 'utf8',
    );
    Je récupère des lignes correspondant a un devis, un BL ou autre. Un exemple de ligne $data['RowQuote'][0]['designation']:

    sur une vue classique HTML avec le charset définit utf-8 ça donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    id' => '51',
    'devis' => '40',
    'row' => '0',
    'article' => '28',
    'designation' => 'Portatif Motorola GP340 VHF gravé RS+',
    'quantity' => '10',
    'prix' => '20.00',
    'during' => '20',
    'remise' => null,
    'prix_remise' => '20.00',
    'total' => '200.00',
    'taxe' => null,
    'type' => '',
    'Article' => array(
    	'reference' => 'MDH25KDC9AN3_E',
    	'type' => '2',
    	'TypeArticle' => array(
    		'label' => 'Matériel'
    	)
    )
    notez bien le "é" de gravé qui me ***** les *****

    maintenant un debug sur mon fichier PDF qui ne contient pas de charset mais un simple contentType

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array(
    	(int) 0 => 'MDH25KDC9AN3_E',
    	(int) 1 => 'Portatif Motorola GP340 VHF gravé RS+',
    	(int) 2 => '10',
    	(int) 3 => '20.00',
    	(int) 4 => '',
    	(int) 5 => '20.00',
    	(int) 6 => '200.00'
    )
    ce résultat est normal puisque je suis sensé afficher du PDF et je debug du texte donc la lib FPDF ne génère pas de PDF et j'ai un contenu "text/html" cependant n'ayant jamais eu ce genre de problème avec les encodages je ne me suis jamais réellement intéressé aux processus mis en causes.

    Comme je ne sais pas réellement quoi chercher je ne trouve pas de réponse et je galère.

    Merci de m'aider, merci de ta réponse j'espère qu'il y en aura d'autre.
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Hello !

    Tu spécifie un encodage ut-8 pour attaquer la base de données alors que celle-ci est en latin1 ? Il faudrait commencer par passer la bdd en utf-8, pour que TOUT soit en utf-8.

    Tu peux aussi forcer ton charset dans ton header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Content-type: application/pdf;charset=UTF-8'
    De manière générale, l'ensemble de ce tutoriel aide beaucoup pour enlever tout risque d'erreur potentiel.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre confirmé
    Avatar de Darkaurora
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 382
    Points : 549
    Points
    549
    Billets dans le blog
    1
    Par défaut
    J'ai suivis ce tutoriel hier ainsi que toutes tes recommandations j'y ai passé toute une journée et une partie de la nuit sur ce problème et il n'y a pas de soucis entre les données IN BDD et le décodage/encodage lors des requêtes.

    Pourquoi je dis ça ? car j'ai tout simplement répliqué ma BDD (entièrement) je l'ai passé en UTF-8 corrigé l'ensemble des caractères mal encodé dans l'espoir d'obtenir résultat... Temps perdus 4h résultat 0 productivité -500%

    Le charset après le content type ne change rien non plus. Je ne dis pas que ça ne fonctionne pas mais c'est étrange en fait.

    Si je retire le $this->response->type( 'pdf' ) rien ne fonctionne bien que j'ai un header contentType: Application/pdf...

    c'est pourquoi je pense que cela viens de la déclaration du type d'encodage de la page. Mais ou ? pas moyen de trouver. Bref je suis passé a tcpdf un fpdf plus puissant mais obliger de réécrire une bonne partie de mes méthodes car ça plante sévère.

    EDIT: il semblerait que le problème est toujours la, la seule différence avec tcpdf est qu'il imprime les caractères
    Je préfère fermer ma gueule et passer pour un con que de l'ouvrir et ne laisser aucun doute à ce sujet.

Discussions similaires

  1. [Encodage] Grec mal encodé et UTF-8
    Par AYMEN.G dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2010, 11h47
  2. [C# 2.0] Comment réaliser un encodage UTF-8 ?
    Par StormimOn dans le forum C#
    Réponses: 2
    Dernier message: 18/10/2006, 10h35
  3. [Conception] UTF-8 = entités encodées directement dans le bd ?
    Par ToxiZz dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/08/2006, 17h13
  4. Pb Encodage UTF-8 pour Ooo
    Par Sylvain James dans le forum XMLRAD
    Réponses: 10
    Dernier message: 08/03/2006, 22h28
  5. [WebForms] Encodage, UTF-8 et accents
    Par alexischmit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 28/04/2004, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo