2010-06-01 93 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; 
}