Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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 :
$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 :
<?php echo $this->headMeta(); ?>
Enfin j'ai tenté dans la vue un utf8_encode($this->view->maVariable) mais ça ne change rien..
Hors ligne
voici ma classe ajax elle dérive de Zend_Action et mes contrôleur ajax dérive de cette classe
<?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
Merci pour ta réponse mais je recherche simplement à trouver comment afficher les caractères spéciaux de façon correcte.
Hors ligne
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
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 :
$test = array("test à test"); $test2 = Zend_Json::encode($test); echo $test2;
m'affiche : ["test \u00200074est"]
Mon navigateur utilisant bien l'utf-8.
en faisant :
$test = array(utf8_encode("test à test"));
j'obtiens : ["test \u00e0 test"]
Hors ligne
Salut,
Avec ça ?
$test2 = utf8_encode(Zend_Json::encode($test));
Sinon la conversion plus complète de sekaijin:
$test2 = utf8_encode(ereg_replace('"__className":"[^\"]+",', '',Zend_Json_Encoder::encode($test)));
A+ benjamin.
Hors ligne
Nan ça ne fonctionne pas mieux...
Hors ligne
est-ce que ton client est en utf8 ??
Hors ligne
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 :
[db] db.adapter = PDO_MYSQL db.params.host = localhost db.params.username = xx db.params.password = xx db.params.dbname = xx
Mon bootstrap :
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 :
<?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 :
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 :
<?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
Dernière modification par riky'' (09-07-2009 23:37:25)
Hors ligne
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 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
Hors ligne
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
Bonsoir
je viens de tomber sur le même pb il y a un vrais blème là
ligne: Zend_Json_Encoder: 263
$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
/** * 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
/** * 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
je viens de faire la dite classe
<?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
Pages: 1