Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 09-07-2009 08:48:23

riky'
Membre
Date d'inscription: 25-06-2009
Messages: 12

[ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Bonjour,

Je souhaite utiliser la fonction Zend_JSON::encode() pour transformer des objets php en JSON.
La fonction marche plutôt bien mais lorsqu'il y a un caractère spécial (é, à, ...) ça me renvoie "null".

J'ai vu qu'il fallait ajouter une ligne :

Code:

Zend_Json::$useBuiltinEncoderDecoder = true;

Avec cette ligne, je n'ai pu "null" mais à la place de "Entité1", j'ai "Entit\u00310000" ce qui est déjà mieux mais pas vraiment lisible..

J'ai aussi testé de mettre dans la fonction _initViewHelpers() du bootstrap :

Code:

$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$view->doctype('XHTML1_TRANSITIONAL');
$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf8');

puis dans le layout :

Code:

<?php echo $this->headMeta(); ?>

Enfin j'ai tenté dans la vue un utf8_encode($this->view->maVariable) mais ça ne change rien..

Hors ligne

 

#2 09-07-2009 11:15:43

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

voici ma classe ajax elle dérive de Zend_Action et mes contrôleur ajax dérive de cette classe

Code:

<?php
Zend_Loader::loadClass("Application_Controllers_Action");

class Application_Controllers_Ajax extends Application_Controllers_Action
{
    protected $_useHistory = false;

    /**
     * initialise le controleur
     * tout les controleur ajax ne retourne pas de vue
     * ils envoient du json au client
     */
    public function init()
    {
        parent::init();
        $this->getFrontController()->setParam('noViewRenderer', true);
        if ($this->_request->isXmlHttpRequest()) {
            $this->_response->setHeader('Content-Type', 'application/json; charset=UTF-8', true);
        } else {
            // on envoie la reponse en texte lors d'une invocation via le navigateur
            // cela permet de tester la réponse.
            $this->_response->setHeader('Content-Type', 'text/plain; charset=UTF-8', true);
        }
        $this->response = array();
    }

    protected function _setListResponse($data, $count = null) {
        if (is_array($data) || null != $count) {
            if (null == $count) {
                $count = count($data);
            }
            $this->response = array(
            'success' => true,
            'results' =>$count,
            'count' =>count($data),
            'rows'=> $data
            );
        } else {
            $this->response = array(
            'success' => false,
            'error' => RES_EMPTY,
            'results' =>0,
            'count' =>0,
            'rows'=> null
            );
        }
    }

    public function postDispatch() {
        Zend_Loader::loadClass('Zend_Json_Encoder');
        echo utf8_encode(ereg_replace('"__className":"[^\"]+",', '',Zend_Json_Encoder::encode($this->response)));
        parent::postDispatch();

    }
}

le contrôleur ajax s'utilisent comme des contrôleur std sauf qu'il n'ont pas de vue (pas de $this->view) il ont à la place un $this->response qui est un tableau dans le quel je place de valeur ou des objets.

le postdispach s'occupe seul d'envoyer la réponse au client.
avec Zend_Json_Encoder si la réponse contient une classe alors le nom de la classe est trasmis au client
c'est inutile et ça apporte des information utilisable par un hacker ce qui explique le petit
ereg_replace('"__className":"[^\"]+",'
ça permet de faire le ménage

la méthode _setListResponse est un truc à moi que j'utilise partout lorsque la réponse est une liste de valeur je la formate toujours de cette façon success pour dire si ça c'est bien passé result le nombre total d'élément dans la liste count le nombre effectif d'élément dans la réponse et rows la liste elle même

A+JYT

Hors ligne

 

#3 09-07-2009 14:29:24

riky'
Membre
Date d'inscription: 25-06-2009
Messages: 12

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Merci pour ta réponse mais je recherche simplement à trouver comment afficher les caractères spéciaux de façon correcte.

Hors ligne

 

#4 09-07-2009 15:59:28

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

c'est pour ça que je réponds
je n'ai avec cette classe aucun problème de caractères spéciaux
A+JYT
PS: toutes mes pages HTML sont en UTF8

Hors ligne

 

#5 09-07-2009 16:10:32

riky'
Membre
Date d'inscription: 25-06-2009
Messages: 12

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

D'accord mais en fait moi je l'utilise autrement (et à vrai dire, comme je débute depuis peu ZF, je n'ai pas tout compris ce que t'avais mis)
Un simple code comme celui ci :

Code:

$test = array("test à test");
$test2 = Zend_Json::encode($test);
echo $test2;

m'affiche : ["test \u00200074est"]
Mon navigateur utilisant bien l'utf-8.

en faisant :

Code:

$test = array(utf8_encode("test à test"));

j'obtiens : ["test \u00e0 test"]

Hors ligne

 

#6 09-07-2009 16:38:16

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Salut,

Avec ça ?

Code:

$test2 = utf8_encode(Zend_Json::encode($test));

Sinon la conversion plus complète de sekaijin:

Code:

$test2 = utf8_encode(ereg_replace('"__className":"[^\"]+",', '',Zend_Json_Encoder::encode($test)));

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#7 09-07-2009 16:46:41

riky'
Membre
Date d'inscription: 25-06-2009
Messages: 12

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Nan ça ne fonctionne pas mieux...

Hors ligne

 

#8 09-07-2009 20:44:13

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

est-ce que ton client est en utf8 ??

Hors ligne

 

#9 09-07-2009 23:32:11

riky''
Nouveau membre
Date d'inscription: 09-07-2009
Messages: 6

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Qu'appelles tu par client ? le navigateur ?
J'ai trouvé ça sur le net : http://www.kitpages.fr/php_tutorial_utf8.php
Mais même en faisant tout ce qui est demandé, je n'arrive pas à afficher les caractères spéciaux..

Fichier db.ini :

Code:

[db]
db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.username = xx
db.params.password = xx
db.params.dbname = xx

Mon bootstrap :

Code:

protected function _initAutoload(){
        $moduleLoader = new Zend_Application_Module_Autoloader(array(
        'namespace' => '',
        'basePath' => APPLICATION_PATH));
        return $moduleLoader;
    }
    
    function _initViewHelpers(){
        $this->bootstrap('layout');
        $layout = $this->getResource('layout');
        $view = $layout->getView();
        $view->doctype('XHTML1_STRICT');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8');
    }
    
    function _initDataBase(){
        $chemin = APPLICATION_PATH.'\configs\db.ini';
        $config = new Zend_Config_Ini($chemin,'db');
        $db = Zend_Db::factory($config->db);
        $db->query('SET NAMES "utf8"');
        Zend_Registry::set(‘db’, $db);
        Zend_Db_Table_Abstract::setDefaultAdapter($db);
    }

Mon layout :

Code:

<?php echo $this->doctype('XHTML1_STRICT'); ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php echo $this->headMeta(); ?>
<?php echo $this->headTitle(); ?>
<?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/site.css'); ?>
</head>
<body>
<div id="content">
<h1><?php echo $this->escape($this->title); ?></h1>
<?php echo $this->layout()->content; ?>
</div>
</body>
</html>

Mon controller :

Code:

class MonController extends Zend_Controller_Action
{

    public function init()
    {
        $this->view->setEncoding('utf-8');
        
    }

    public function indexAction(){
        $a = 'a et é et é';
        $this->view->test = Zend_Json::encode($a); 
    }
}

Ma vue :

Code:

<?php
header('Content-Type: text/html; charset=utf-8');
$this->setEncoding('utf-8');
echo $this->test;
?>

J'ai aussi mis le charset utf-8 dans Eclipse, mes tables et ma base sont aussi en utf-8 (même si pour l'exemple on ne s'en sert pas), il y a juste apache que je ne sait pas trop configurer (vu que je n'ai pas de virtualhost, je ne sais pas où insérer la ligne "AddDefaultCharset UTF-8") mais j'ai utilisé l'autre solution.
Bref ça m'embête pas mal quand même.
En tout cas merci pour vos réponses wink

Dernière modification par riky'' (09-07-2009 23:37:25)

Hors ligne

 

#10 15-07-2009 11:22:56

podo
Membre
Date d'inscription: 29-06-2009
Messages: 18

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Slt ! Pour la ligne dans apache tu va dans le http.conf

Xampp/apache/conf/http.conf

Tu fait un ctrl+f et tu cherche header... Quand tu a trouver l'endroit ou inscrire les header... Tu ajoute ta propre ligne a la suite...

Je te conseil je la commenter pour les futurs developpeurs qui passeront derrière toi wink Je travail dans une SSII depuit 4ans maintenant et je me rappel que ca m'a bien aider quand je debutait et que je reprenais des travaux en cours wink

Hors ligne

 

#11 15-07-2009 14:31:51

riky''
Nouveau membre
Date d'inscription: 09-07-2009
Messages: 6

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Après de maintes recherches, le problème est résolu en prenant une version antérieure de la librairie JSON..
J'ai remplacé mon fichier JSON/Encode.php par celui çi : http://framework.zend.com/svn/framework … ncoder.php

Hors ligne

 

#12 18-01-2010 17:59:16

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

Bonsoir

je viens de tomber sur le même pb il y a un vrais blème là
ligne: Zend_Json_Encoder: 263

Code:

        $string = self::encodeUnicodeString($string);

voilà le code fautif

la méthode ligne 435 est appelé systématiquement
il devient donc impossible de faire transiter du JSON simple sans en passer par l'unicode

Code:

    /**
     * Encode Unicode Characters to \u0000 ASCII syntax.
     *
     * This algorithm was originally developed for the
     * Solar Framework by Paul M. Jones
     *
     * @link   http://solarphp.com/
     * @link   http://svn.solarphp.com/core/trunk/Solar/Json.php
     * @param  string $value
     * @return string
     */
    public static function encodeUnicodeString($value)

il aurait fallut mettre un argument ou un membre statique pour pouvoir l'inhiber au besoin
il reste une seule solution dans votre dossier library crée une classe dérivée et redéfinir la méthode

Code:

    /**
     * JSON encode a string value by escaping characters as necessary
     *
     * @param $value string
     * @return string
     */
    protected function _encodeString(&$string)
    {
        // Escape these characters with a backslash:
        // " \ / \n \r \t \b \f
        $search  = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
        $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
        $string  = str_replace($search, $replace, $string);

        // Escape certain ASCII characters:
        // 0x08 => \b
        // 0x0c => \f
        $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);
        //$string = self::encodeUnicodeString($string);

        return '"' . $string . '"';
    }

A+JYT

Hors ligne

 

#13 18-01-2010 18:20:20

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [ZF 1.8][Zend_JSON] Problème d'encode des caractères spéciaux

je viens de faire la dite classe

Code:

<?php
/**
 * Encode PHP constructs to JSON
 *
 * @category   Fast
 * @package    Fast_Json
 */
class Fast_Json_Encoder extends Zend_Json_Encoder
{

    /**
     * Use the JSON encoding scheme for the value specified
     *
     * @param mixed $value The value to be encoded
     * @param boolean $cycleCheck Whether or not to check for possible object recursion when encoding
     * @param array $options Additional options used during encoding
     * @return string  The encoded value
     */
    public static function encode($value, $cycleCheck = false, $options = array())
    {
        $encoder = new self(($cycleCheck) ? true : false, $options);

        return $encoder->_encodeValue($value);
    }

    /**
     * JSON encode a string value by escaping characters as necessary
     * not use encodeUnicodeString not encode Unicode Characters to \u0000 ASCII syntax     
     *
     * @param $value string
     * @return string
     */
    protected function _encodeString(&$string)
    {
        // Escape these characters with a backslash:
        // " \ / \n \r \t \b \f
        $search  = array('\\', "\n", "\t", "\r", "\b", "\f", '"');
        $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"');
        $string  = str_replace($search, $replace, $string);

        // Escape certain ASCII characters:
        // 0x08 => \b
        // 0x0c => \f
        $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string);

        return '"' . $string . '"';
    }
}

A+JYT

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages