2010-08-20 12 views
1

Je construis une application web dans le framework zend qui nécessite le support UTF8 pour toutes les langues. Cela semble fonctionner correctement, sauf pour des fonctions telles que stripslashes et autres.L'application Zend Framework a-t-elle besoin de mbstring pour le support UTF8?

Sur cette URL, ils parlent de l'utilisation mbstring http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

Est-il nécessaire d'utiliser mbstring sur mon serveur et remplacer toutes les occurences des fonctions UTF8 incapables par leur MB variante?

Zend Framework ne supporte-t-il pas UTF8? Sinon, nous devrions remplacer toutes les fonctions de la base de code ZF par leurs alternatives mb_, n'est-ce pas? Ce qui est une tâche impossible car une mise à niveau vers un nouveau ZF casserait notre code.

mail()  -> mb_send_mail() 
strlen() -> mb_strlen() 
strpos() -> mb_strpos() 
strrpos() -> mb_strrpos() 
substr() -> mb_substr() 
strtolower() -> mb_strtolower() 
strtoupper() -> mb_strtoupper() 
substr_count() -> mb_substr_count() 
ereg()  -> mb_ereg() 
eregi()  -> mb_eregi() 
ereg_replace() -> mb_ereg_replace() 
eregi_replace() -> mb_eregi_replace() 
split()  -> mb_split() 

Quel est votre conseil à ce sujet, je peux me tromper complètement à ce sujet? je lis sur l'utilisation:

mbstring.func_overload = 7 ; 

à surcharger toutes les fonctions automatiquement.

Est-ce que cela casse une application existante qui n'a pas besoin de UTF8 ou se "dégrade-t-elle gracieusement"?

+1

Juste une petite remarque: vous ne devriez pas utiliser mail() dans ZF, utilisez [Zend_Mail] (http://zendframework.com/manual/fr/zend.mail.html) à la place. – wimvds

Répondre

1

Est-ce que Zend Framework ne supporte pas supporte UTF8?

Je ne sais pas. Il suffit de parcourir le code à la recherche de strlen par exemple, mais vous devrez toujours regarder le code pour déterminer s'il est utilisé dans un contexte qui n'est pas multi-octets. Googling rapide a révélé ce http://www.iezzi.ch/archives/371 alors il semble que ZF est préparé pour les applications UTF8.

Quels sont vos conseils à ce sujet, je pourrais être complètement faux sur ce? J'ai lu environ en utilisant: mbstring.func_overload = 7; Est-ce que cela brise une application existante qui n'a pas besoin de UTF8 ou le fait-il "se dégrader gracieusement"?

Bien sûr, cela fonctionnera également pour les chaînes non multi-octets et ne les cassera pas. Mais avant de l'utiliser, je suggère de vous assurer que vous en avez vraiment besoin car cela va coûter de la performance.

3

Je ne pense pas surcharger toutes les fonctions avec mb_string serait bon, nous savons tous que PHP ne gère pas nativement UTF8 nous utilisons donc quelque chose comme

« SET NAMES utf8 » pour la base de données que nous & utiliser Zendmail + passer le codage comme paramètre de laisser Zend courrier gérer l'auto interne

est un autre exemple Zend_Validate_StringLength avait un paramètre appelé encoding et il utilise iconv en fonction appelée:

public function setEncoding($encoding = null) 
    { 
     if ($encoding !== null) { 
      $orig = iconv_get_encoding('internal_encoding'); 
      $result = iconv_set_encoding('internal_encoding', $encoding); 
      if (!$result) { 
       require_once 'Zend/Validate/Exception.php'; 
       throw new Zend_Validate_Exception('Given encoding not supported on this OS!'); 
      } 

      iconv_set_encoding('internal_encoding', $orig); 
     } 

     $this->_encoding = $encoding; 
     return $this; 
    } 

mais vous utiliserez toujours mb_string dans votre application dans une logique qui n'est pas liée à la structure.

par exemple hier, je triait un tableau de UTF8 & post commentaires à partir d'une base de données

je ne pouvais pas faire le travail sans utiliser la chaîne mb parce que PHP ne gère pas nativement UTF8 :(

j'aime string mb il m'a rendu la vie plus facile

EDIT:. ce que je voulais dire est d'utiliser la mbstring chaque fois que vous en avez besoin, et que le cadre lui-même gérer, je ne surcharge aime pas toutes les fonctions automatiquement

3

Ne pas, et je ne peux que répéter, ne pas utiliser mbstring surcharge. Il va très certainement casser n'importe quelle méthode qui, par exemple, repose sur strlen() retournant le nombre d'octets. Tous les composants de Zend Framework attendent par défaut UTF-8, mais peuvent gérer des jeux de caractères différents si vous le leur demandez. Cela se fait via iconv_ *, qui est construit en PHP par défaut, donc il n'y a pas de dépendances sur des bibliothèques supplémentaires comme mbstring. La seule chose que vous devez dire à Zend Framework à propos de UTF-8 est votre connexion à la base de données, ce que vous pouvez faire simplement via l'option charset (voir la documentation de Zend_Db ou Zend_Application). Vous souhaitez également indiquer à l'agent utilisateur quel jeu de caractères vous distribuez via l'en-tête de type de contenu. Et n'oubliez pas d'ajouter accept-charset = "utf-8" dans vos tags.

+0

merci, pouvez-vous me dire pourquoi je lis que les fonctions de chaîne standard dans php comme strlen ne fonctionnent pas bien avec UTF8 ou des langues comme le japonais, l'arabe, ... J'ai lu que j'ai besoin d'utiliser mbstring pour – Jorre

+0

Toutes les fonctions de chaîne PHP ne sont pas multi-octets, c'est-à-dire qu'elles fonctionnent toutes en octets. Si vous avez besoin de fonctions multi-octets, vous devriez toujours regarder iconv_ * (par exemple iconv_strlen), car la bibliothèque iconv est intégrée dans PHP par défaut. Si vous n'y trouvez pas de fonction appropriée, alors vous pouvez regarder dans mb_ *. Il existe même deux fonctions qui n'existent pas dans l'une ou l'autre de ces fonctions, à savoir word_wrap() et strpad(). J'ai implémenté ceux via iconv dans Zend_Text_MultiByte. – DASPRiD