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

Zend Framework PHP Discussion :

Stratégie CHARSET db/view... mb_string et cie


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut Stratégie CHARSET db/view... mb_string et cie
    bonjour,

    je viens de me mettre au zf.

    quelle est la bonne stratégie pour les charset ?

    voici ma piste

    config.ini
    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
     
     
    [global]
    input.encoding            = ISO-8859-15 #par exemple
    output.encoding            = ISO-8859-15 #par exemple
    internal.encoding              = ISO-8859-15 #par exemple
     
    ...
    [prod : global]
    ...
     
    ...
     
    database.collation = utf8_swedish_ci
    database.charset   = utf8
    database.encoding = UTF-8
    ....
    dans le bootstrap (index.php)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Zend_Registry::get("db")->getConnection()->exec("SET NAMES '".Zend_Registry::get("config")->database->charset."' COLLATE '".Zend_Registry::get("config")->database->collation."'");
    donc il faut maintenant bien filtrer ce que je récupère de la base et ce que j'y met...

    je pensais décliner une classe Zend_Db pour surcharger la fonction ->quote() et les fonctions de type ->fetch() et glisser des petits mb_convert_encoding() pour convertir entre work.charset et database.charset.

    Ensuite utiliser $view->setEscape() pour indiquer une fonction qui utilise mb_convert_encoding() pour convertir vers output.charset. Ou bien décliner Zend_View pour surcharger escape() et ajouter 2 méthodes ->setWorkEncoding() et ->setOutputEncoding() (pour être plus esthétique).

    est-ce la bonne stratégie ? l'idée est de pouvoir être très générique bien sûr

    comment faites vous ?

    EDIT :

    et avec mbstring.encoding_translation quelqu'un a testé ? => pas bien

    EDIT 2 :

    j'ai sous-classer Zend_Db_Adapter_Pdo_Mysql

    EDIT 3 :

    en mysql le charset latin1 correspond à Windows-1252 en mbstring

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    après quelques heures de farfouillage de docs et de codes...

    pour la base de données :
    sous-classer Zend_Db_Adapter_Pdo_Mysql (pour Mysql) semble être une bonne idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    class Encoding_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
    pour input http :
    sous-classer les zend_filter

    pour output http :

    le moteur mbstring en automatique (mbstring.encoding_translation On) c'est pas le top (risque d'effet de bord, impact selon l'implémentation du zf, très lié à la conf serveur, etc)

    mbstring permet aussi d'utiliser ob_start avec une fonction de callback mais ob_start est aussi utilisé par zend_cache.....

    d'où l'idée d'une classe Encoding_Dummy_Cache_Page qui utilise ob_start uniquement pour la convertion mbstring et pour vraiment utilser la cache + mbstring il faut sous-classer Zend_Cache_Page en Encoding_Cache_Page (par ex)

    cela permet de rester cohérent avec les évolutions du zf...

    commentaires ?

    EDIT : le code

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    class Encoding_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Mysql
    {
     
    	protected $_charset = false;
    	protected $_collation = false;
    	protected $_databaseEncoding = false;
    	protected $_internalEncoding = false;
     
    	public function __construct($config)
    	{
    		parent::__construct($config);
     
    		if(isset($this->_config['charset']))
    		{
    			$this->setCharset($this->_config['charset']);
    		}
    		if(isset($this->_config['collation']))
    		{
    			$this->setCollation($this->_config['collation']);
    		}
    	}
     
    	public function setCharset($charset)
    	{
    		$this->_charset=$charset;
    	}
     
    	public function getCharset()
    	{
    		return $this->_charset;
    	}
     
    	public function setCollation($collation)
    	{
    		$this->_collation=$collation;
    	}
     
    	public function setEncodings($database, $internal)
    	{
    		$this->_databaseEncoding = $database;
    		$this->_internalEncoding = $internal;
    	}
     
    	public function getDatabaseEncoding()
    	{
    		return $this->_databaseEncoding;
    	}
     
    	public function getInternalEncoding()
    	{
    		return $this->_internalEncoding;
    	}
     
    	public function getCollation()
    	{
    		return $this->_collation;
    	}
     
    	protected function _connect()
    	{
    		if ($this->_connection)
    		return;
     
    		parent::_connect();
     
    		// please do not touch names if I don't tell you to do so
    		//$this->_connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
     
    		if($this->getCharset())
    		{
    			if($this->getCollation())
    			{
    				$this->query("SET NAMES '".$this->getCharset()."' COLLATE '".$this->getCollation()."'");
    			}
    			else
    			{
    				$this->query("SET NAMES '".$this->getCharset()."'");
    			}
    		}
    	}
    }
    et l'appel dans le bootstrap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		$db = Zend_Db::factory('Pdo_Mysql', array(
        'host'             => Zend_Registry::get("config")->database->host,
        'username'         => Zend_Registry::get("config")->database->username,
        'password'         => Zend_Registry::get("config")->database->password,
        'dbname'           => Zend_Registry::get("config")->database->name,
    	'charset'          => Zend_Registry::get("config")->database->charset,
    	'collation'        => Zend_Registry::get("config")->database->collation,
    	'options'		   => $options,
    	'adapterNamespace' => 'Encoding_Db_Adapter', //cf classe Encoding_Db_Adapter_Pdo_Mysql
    		));

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    Par défaut
    re,

    je continue ce post seul

    pour le output le pseudo cache c pas une bonne piste...

    j'utilise juste le $view->setEscape

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    if(Zend_Registry::get("config")->internal->encoding!=Zend_Registry::get("config")->output->encoding)
    {
    	Zend_Loader::loadClass('Encoding_Escape');
    	$escape=new Encoding_Escape(Zend_Registry::get("config")->internal->encoding,Zend_Registry::get("config")->output->encoding);
    	$view->setEscape(array($escape, "escape"));
    }
    else
    {
    	$view->setEncoding(Zend_Registry::get("config")->internal->encoding);
    }
    Encoding_Escape :
    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
     
    class Encoding_Escape
    {
    	protected $_internalEncoding;
    	protected $_outputEncoding;
     
    	public function __construct($internal, $output)
    	{
    		$this->_internalEncoding=$internal;
    		$this->_outputEncoding=$output;
    	}
     
    	public function escape($string)
    	{
    		return mb_convert_encoding(htmlspecialchars($string,ENT_COMPAT,$this->_internalEncoding),$this->_outputEncoding,$this->_internalEncoding);
    	}
    }
    a+

Discussions similaires

  1. [ALTER][VIEW] Problème de charset
    Par shintaa dans le forum Requêtes
    Réponses: 1
    Dernier message: 25/07/2011, 18h07
  2. Algorithme d'Avizienis et cie
    Par zul dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 08/11/2002, 23h19
  3. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30
  4. Réponses: 6
    Dernier message: 21/06/2002, 14h48
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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