2010-06-01 8 views
0

i ont cette chaîne dans mon utf-8 MySQL DB: « prueba de Enes »caractères spéciaux comportement étrange

Quand je l'imprimer comme texte brut, tout fonctionne bien, mais si je charge le même champ à l'intérieur d'un input, textarea, etc, il devient: "Pruebá de eñ es"

Comment puis-je résoudre ce problème? = (

+0

uhhh ... tant pis. il semble que toutes les entrées, textarea imprime en passant par ceci: htmlentities ($ data, ENT_QUOTES) // le programmeur précédent a implémenté cela parce que c'était un latin1_general_ci db. – andufo

+0

Imprimer à quoi? Console? Page Web? –

+0

Vous devez utiliser 'htmlspecialchars' et * not *' htmlentities' (sauf si vous avez une raison spéciale et que vous savez ce que vous faites). 'htmlentities' gâchera les caractères non-ASCII à moins que vous ne lui disiez l'argument' $ charset' correct (la valeur par défaut n'est pas raisonnable). ** Ne supprimez pas ** les appels 'htmlentities' car vous risquez d'introduire des vulnérabilités d'injection HTML (menant à XSS). Utilisez 'htmlspecialchars' à la place. – bobince

Répondre

1

D'abord, je vous recommande de lire ceci:! http://www.joelonsoftware.com/articles/Unicode.html (Le logiciel Chaque Absolute minimum Developer Absolument, Positively doit savoir sur Unicode et les jeux de caractères (No Excuses) par Joel Spolsky) vraiment utile

Alors si c'est MySQL. vous pouvez définir le jeu de caractères par défaut dans la connexion par "SET NAMES 'utf8'" Par exemple dans Zend_Framework ($ db-> query ("SET NAMES 'utf8'");)

Une autre option est d'ajouter un filtre aux données avant de l'imprimer dans l'écran.J'ai fait deux fonctions de main ...

function utf8encode ($subject, $action = '//TRANSLIT') 
{ 
    if (@iconv('UTF-8', "UTF-8{$action}", $subject) == $subject) { 
        #-- the value it's utf8 
    } else { 
        $subject = utf8_encode ($subject); 
    } 

return $subject; 

}

function utf8decode ($subject, $action = '//TRANSLIT') 
{ 
    if (@iconv('UTF-8', "UTF-8{$action}", $subject) == $subject){ 
         $subject = utf8_decode ($subject); 
    } else { 
         #-- the value is probably ISO-8859-1 
    } 

return $subject; 
}