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

MVC PHP Discussion :

UTF-8 qui s'affiche mal [ZF 1.7]


Sujet :

MVC PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut UTF-8 qui s'affiche mal
    Bonjour,

    Les problèmes de charsets commence à me taper très sérieusement sur le système… Je suis encore débutant, et j'ai déjà affrontés moult obstacles à vouloir utiliser UTF-8 sans framework…

    J'essaie de me mettre à Zend, et premier problème : affichage anormal !



    Bref, fini de pleurer… J'ai cru comprendre que Zend discute généralement bien avec UTF-8, j'ai fait moult recherches (depuis 24h), mais rien

    Le code. Bootstrap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    // Chargement de la configuration
    $config = new Zend_Config_Ini('./application/config.ini', 'general');
    $registry = Zend_Registry::getInstance();
    $registry->set('config', $config);
     
    try {
    	$db		= Zend_Db::factory($config->db); }
    catch (Zend_Db_Adapter_Exception $e){
    		echo $e->getMessage(); }
    Zend_Db_Table::setDefaultAdapter($db);
    Le controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    class IndexController extends Zend_Controller_Action 
    {
     
        function indexAction()
        {
    		$this->view->title = "Accueil";
    		$nouvelles = new News();
    		$this->view->nouvelle	= $nouvelles->fetchRow();
        }
    }
    La vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h2>La dernière news</h2>
     
    <h3><?php echo $this->nouvelle->titre; ?></h3>
    <?php echo $this->nouvelle->contenu;?>

    En l'état j'obtiens ceci :

    Enfin... Après de longues heures de gestation étalées sur un peu plus de trois mois,
    Le plus drôle est qu'en ajoutant un "utf8_decode()" dans la vue, le résultat est plus propre, j'ai seulement les "à" qui sont remplacé par le point d'intérrogation dans un carré noir... Aucune idée pour les caractères chinois que je vais avoir à utiliser, mais j'ai un peu peur !

    Enfin... Après de longues heures de gestation étalées sur un peu plus de trois mois,
    Je précise que ma BDD MySQL est entièrement en utf8_unicode_ci, tou mes fichiers de scripts en UTF8 without BOM, que j'ai bien les méta pour indiquer d'afficher en UTF-8, et que d'ailleurs Firefox le fait…


    Je vous en supplie, dites moi que je ne suis vraiment qu'un idiot de débutant et que mon problème est très simple à régler !


    Merci d'avance

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Une fois que tu as ton $db = Zend_Db::factory(...), met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db->query("SET NAMES 'utf8'");

  3. #3
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Salut,

    Il faut spécifier à la vue que tu souhaites utiliser UTF-8. Il faut le faire dans tous les contrôleurs, j'ai personnellement préféré un plug-in à un contrôleur que tous mes autres contrôleurs étendraient.

    Voici le code, très simple :
    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
    <?php
    class View_Setup_Plugin extends Zend_Controller_Plugin_Abstract
    {
     
        private $_view = null;
     
        public function __construct($view)
        {
            $this->_view = $view;
        }
     
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
     
            $this->_view->baseUrl = $this->_request->getBaseUrl();
     
            $this->_view->setEscape('utf8_encode');
            $this->_view->setEncoding('utf-8');
     
        }
     
    }
    Dans ton bootstrap, tu ajoutes ce plug-in :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_front->registerPlugin(new Netigloo_View_Plugin($view));
    Cela devrait réglait ton problème.

    Bon courage

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Autre bonne pratique à mettre en oeuvre dans tes vues : Protéger les chaines de caractères ! Pour cela la fonction escape est très pratique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h2>La dernière news</h2>
     
    <h3><?php echo $this->escape($this->nouvelle->titre); ?></h3>
    <?php echo $this->escape($this->nouvelle->contenu);?>
    Ensuite tu peux modifier en un endroit ce que réalise la fonction escape.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Citation Envoyé par Alexandre T Voir le message
    Autre bonne pratique à mettre en oeuvre dans tes vues : Protéger les chaines de caractères ! Pour cela la fonction escape est très pratique.

    Oui, je sais, mais en bon débutant j'ai fait l'erreur de mettre des balises HTML dans ma BDD, et la fonction escape me les sort évidemment sous forme de chaîne ! Il faudra que je fasse une moulinette pour tout transformer ne BBCode


    Sinon je vais de ce pas essayer la méthode de Janitrix, ayant déjà croisé celle de goodpz mais apparemment celle-ci n'est pas très bien vis-à-vis de la BDD

    Merci pour vos réponses !



    PS : Ahem, où je dois mettre le code du plug-in ?? Désolé je suis vraiment débutant en Zend Qu'est-ce que Netigloo également ??

  6. #6
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Je te conseille de créer un répertoire pour tes classes dans le dossier 'library'. Si ton site à un nom adéquat, tu peux créer un dossier du même nom. Le but est de centraliser toutes tes classes sous un namespace commun. Netigloo est ici le nom de mon application.

    Donc, je prends en exemple ton pseudo. Tu créés un dossier 'Shirraz' dans le dossier 'library'. Tu copies le code du plugin :
    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
    <?php
    class Shirraz_View_Plugin extends Zend_Controller_Plugin_Abstract
    {
     
        private $_view = null;
     
        public function __construct($view)
        {
            $this->_view = $view;
        }
         public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
     
            $this->_view->baseUrl = $this->_request->getBaseUrl();
     
            $this->_view->setEscape('utf8_encode');
            $this->_view->setEncoding('utf-8');
     
        }
     
    }
    Ensuite, dans ton fichier bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_front->registerPlugin(new Shirraz_View_Plugin($view));
    Si tu utilises le viewRenderer, il se peut que tu n'es pas accès à l'objet $view dans ton bootstrap, mais tu dois pouvoir le récupérer assez facilement.

    Bon courage

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Il me répond ceci :

    Fatal error: Using $this when not in object context
    J'ai essayé après le setup du controller, puis après le chargement de la config, mais toujours la même. Pour donner le bootstrap complet :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', 1);
    date_default_timezone_set('Asia/Taipei');
     
    set_include_path('.'
        . PATH_SEPARATOR . './library'
        . PATH_SEPARATOR . './application/models/'
        . PATH_SEPARATOR . get_include_path());
    include "Zend/Loader.php";
    Zend_Loader::registerAutoload();
     
     
    $config = new Zend_Config_Ini('./application/config.ini', 'general');
    $registry = Zend_Registry::getInstance();
    $registry->set('config', $config);
     
     
    try {
    	$db		= Zend_Db::factory($config->db); }
    catch (Zend_Db_Adapter_Exception $e){
    		echo $e->getMessage(); }
    Zend_Db_Table::setDefaultAdapter($db);
     
     
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->throwExceptions(true);
    $frontController->setControllerDirectory('./application/controllers');
    Zend_Layout::startMvc(array('layoutPath'=>'./application/layouts'));
     
     
    $frontController->dispatch();

    Sinon j'ai mi le fichier sous "library/Inner/View_Plugin.php", il falait faire "library/Inner/View/plugin.php" ?? Il m'a semblé que les nom de classes devaient donner leur chemin…


    Bref, désolé de vous embêter, surtout qu'il me faut ouvrir un autre topic :s

  8. #8
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Non tu peux rester dans ce topic. C'est de ma faute j'ai oublié de spécifier que mon bootstrap était contenu dans une classe, d'où le $this. Je pensais que tu saurais adapter le code. Dans ton cas, il suffit de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $frontController->registerPlugin(new Inner_View_Plugin($view));
    Concernant le chemin de la classe, c'est en effet library/Inner/View/plugin.php qu'il faut utiliser. Je te conseille fortement de lire la documentation officielle du Zend Framework, très bien faite, qui répondra à nombre de tes questions : http://framework.zend.com/manual/fr/

    Bon courage.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Ah ben voilà, aider en disant n'importe quoi n'aide pas !! Je rigole, ça reste une aide précieuse


    Apparement tout marche niveau code, j'ai juste instancié un objet "$view = new Inner_View", classe que j'ai pris de la doc de Zend, mais…


    …ça ne change rien

    Pour exemple, j'ai "télévisé" qui s'affiche toujours "télévisés"


    Est-ce que le problème viendrait de la BDD ?? J'ai fait un dump de mon site en ligne pour recréer une BDD identique en locale, normalement tout est resté UTF-8 (à part quand je regarde le contenu des BDD direct dans phpMyAdmin, mais ça a toujours été comme ça :s).

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Up,

    Toujours pas de solution pour moi ??


    Mon site est sur l'île de Taïwan, j'ai donc absolument besoin d'afficher les caractères chinois (et autres), ce n'est pas du tout une option pour moi que d'afficher en UTF-8 ou non


    Merci.

  11. #11
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    As tu fais ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $db->query("SET NAMES 'utf8'");
    Aussi, assure toi que ta page contient bien un header content-type proche de ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    text/html; charset=utf-8
    Normalement, c'est géré par le view automatiquement dès lors que tu précise l'encoding. Dans le doute, rajoute ce genre de chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $response->setHeader('Content-Type', 'text/html; charset=utf-8');
    Avec ton navigateur internet, tu dois pouvoir accéder aux "infos" ou "propriétés" de la page et vérifier quel est l'encoding.

    Aussi, ça fait pas de mal de rajouter une balise meta dans le document html du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    Le caractère "bizarres" que tu obtiens, tels que "télévisés" sont de l'utf8 interprété en latin. Si tes données en DB sont en utf8, si elles sont transmises en utf8 et que tu les affiches tel quel (donc tu n'es pas censé avoir besoins de utf8_encode() etc), alors il ne doit pas y avoir de problèmes.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Ma BDD est bien indiqué comme étant utf8_unicode_ci de partout… J'ai rajouté la ligne pour $db (mais ça ne cause pas une connexion à la BDD ??), mon browser trouve bien que la page est encodé utf-8, etc.


    Par aqis de conscience, j'ai voulu comparé la BDD online avec la locale, sur la première j'ai par exemple "Le Dream Mall (夢時代)", sur la seconde "Le Dream Mall (夢時代)"… Faut plus chercher plus loin

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2008
    Messages : 333
    Points : 586
    Points
    586
    Par défaut
    Résolu…


    Désolé pour ce thread, le problème était très bête… J'ai construit ma base locale avec une sauvegarde de la base online, et pour je ne sais quel raison, cette base à été comme "doublement" encodé en UTF-8…

    J'ai cette fois exporté ma BDD online pour l'importer en locale, et en réalité j'ai dû me débarrasser des solutions qui m'ont été donnés ici pour que ça marche (sinon je gardait le même résultat).


    Bref, merci pour votre aide, désolé d'être stupide…

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/04/2014, 04h54
  2. Menu qui s'affiche mal
    Par Tezcatlipoca dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 05/12/2012, 15h49
  3. [AC-2003] Add et delete de record qui s'affichent mal
    Par Godzestla dans le forum VBA Access
    Réponses: 8
    Dernier message: 18/08/2011, 13h20
  4. boucle for qui s'affiche mal
    Par kate59 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/04/2009, 15h47
  5. [Application MDI] Composants qui s'affichent mal
    Par PiPo123 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/09/2008, 18h10

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