2010-06-01 58 views
0

我有这个串在我的UTF-8 MySQL数据库: “Pruebá德埃内斯”特殊字符的奇怪行为

当我打印它像纯文本,一切工作正常,但如果我加载内部的同场输入,文本区域等,就成了:“Pruebá德EA±ES”

我怎样才能解决这个问题? =(

+0

唔...没关系。它似乎所有的输入,textarea打印通过此:htmlentities($ data,ENT_QUOTES)/ /前面的程序员实现,因为它是一个latin1_general_ci分贝。 – andufo 2010-06-01 20:15:33

+0

打印到什么?安慰?网页? – 2010-06-01 20:15:42

+0

你应该使用'htmlspecialchars'和* not *'htmlentities'(除非你有特殊的理由并知道你在做什么)。 'htmlentities'会弄乱非ASCII字符,除非你告诉它正确的'$ charset'参数(默认是不明智的)。 **不要**只是删除'htmlentities'调用,因为您可能会引入HTML注入漏洞(导致XSS)。改为使用'htmlspecialchars'。 – bobince 2010-06-01 21:37:42

回答

1

首先,我建议阅读:http://www.joelonsoftware.com/articles/Unicode.html(绝对最低每一个软件开发人员绝对,积极必须知道的关于Unicode和字符集(由Joel Spolsky的没有借口))非常有用

那么,如果它是MySQL的。例如在Zend_Framework($ db-> query(“SET NAMES'utf8'”);)

另一个选择是添加一个过滤器打印它在屏幕前的数据。我做了两个handly功能...

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; 
}