2009-09-23 3 views
1

J'utilise la fonctionnalité MVC dans Zend Framework 1.9, et il semble que Zend_Layout n'encode pas le contenu de la vue en utilisant UTF-8, bien que cela soit défini dans le titre.Zend_Layout ne semble pas encoder le contenu en tant que UTF-8

Le script de mise en page est illustré ci-dessous.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <?php echo $this->headTitle(); ?> 
     <?php echo $this->headMeta(); ?> 
     <?php echo $this->headLink(); ?> 
     <?php echo $this->headScript(); ?> 
    </head> 
    <body> 
     <p>£ $ &pound;</p> 
     <?php echo $this->layout()->content; ?> 
    </body> 
</html> 

Le script de vue peut être trouvé ci-dessous. Dans la mise en page, le symbole dièse sort comme prévu, mais il ne s'affiche pas dans la vue réelle.

Si je supprime la mise en page et affiche simplement la vue, cela sort très bien. Aussi, si je mets le contenu de $ this-> layout() -> à l'intérieur de utf8_encode, tout fonctionne bien.

Je veux juste savoir s'il existe un moyen de résoudre ce problème DANS Zend Framework.

Répondre

1

Par défaut, les vues sont codées dans ISO-8859-1 et non UTF-8; c'est peut-être la raison de votre problème.

Vous trouverez plus d'explications et un exemple dans cette section Survivre à la Deep End: 5.4. Step 3: Implement Application Bootstrapping - il est un peu long, mais certaines choses là-bas pourrait vous aider ...

Voici une citation de cette page:

à l'heure actuelle, Zend_View, en contraste frappant avec à d'autres composants, utilise un jeu de caractères par défaut de l'ISO-8859-1 (comme le font) Voir Helpers qui simplement ne le fera pas si vous êtes aller à la sortie multi-octets c haracters

Et aussi:

Pour changer la valeur par défaut, nous devrions instancier une nouvelle instance de Zend_View, définir un caractère plus approprié codage par défaut UTF-8, et implanter ce modifié Voir l'objet dans le ViewRenderer Action Helper.

Et il y a une autre façon, en utilisant le fichier de configuration .ini, expliquée dans le chapitre suivant; en particulier, section 6.5. Step 4: Handling Setting Of Standard Component Defaults.

+1

La première chose que j'ai faite a été d'utiliser setEncoding sur la vue pour le changer en UTF-8 mais cela ne semblait pas faire de différence. Aurais-je dû faire quelque chose de plus? –

1

Quel est le codage de votre mise en page et de votre fichier de vue? Assurez-vous que les deux sont encodés avec UTF-8. Je soupçonne fortement que votre fichier de vue (celui avec <p>£ $ &pound;</p>) n'est pas codé en UTF-8.

La raison pour laquelle vous voyez le comportement décrit est que le navigateur devine l'encodage utilisé et mis en UTF-8 lors de l'utilisation de la mise en page et à un autre encodage (le plus probable ISO-8859-x) quand vient afficher la voir le script.

Vous devez fournir au navigateur un indice décent sur l'encodage utilisé.Une option consiste à utiliser une balise metahttp-equiv dans la section <head> de votre mise en page, une autre est la définition d'un en-tête HTTP (Content-type: text/html; charset=utf8) sur votre objet de réponse.

+0

Merci. Une chose si simple à négliger. Je dois avoir quelques fichiers PHP ooooold que je continue à cloner. Besoin de faire un peu de nettoyage de printemps. –

1

Faites-le dans votre bootstrap.

$view->setEncoding('UTF-8'); 
$view->doctype('XHTML1_STRICT'); 
$view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); 

J'utilise généralement cette fonction dans mon bootstrap

protected function _initDoctype() 
{ 
$this->bootstrap('view'); 
    $view = $this->getResource('view'); 

    $view->addHelperPath(.....); 
    $view->addHelperPath(.....); 

    $view->setEncoding('UTF-8'); 
    $view->doctype('XHTML1_STRICT'); 
    $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); 

}

Autre possibilité:

Dans votre fichier de mise en page

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Et n'echo $ this- > headmeta() du tout.

+1

Si vous amorcez la vue par $ this-> bootstrap ('view') Puis dans votre fichier config.ini ajoutez ceci resources.view [] = –

Questions connexes