2013-04-09 122 views
6

我有一個包含特殊字符(例如™)的表。使用PHP從MySQL數據庫中獲取特殊字符

可以使用phpMyAdmin和其他軟件輸入和查看此字符,但是當我在PHP中使用SELECT語句輸出到瀏覽器時,我會在其中輸入帶有問號的鑽石。

表格類型是MyISAM。編碼是UTF-8 Unicode。排序規則是utf8_unicode_ci。

的HTML頭部中的第一行是

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

我試圖將其輸出之前,使用上的字符串ヶ輛()函數。沒有運氣。

我也嘗試添加此任何輸出之前到PHP(無差異):

header('Content-type: text/html; charset=utf-8'); 

最後我嘗試添加初始MySQL連接低於該右(這導致了附加的奇數字符顯示的):

$db_charset = mysql_set_charset('utf8',$db); 

我錯過了什麼?

+2

與問題本身無關,但請使用'mysqli'或PDO而不是'mysql'擴展名,這已被棄用。 – 2013-04-09 03:10:02

+0

你確定數據庫中的任何東西實際上是utf8嗎? – 2013-04-09 03:12:03

+0

[在Web應用程序中處理Unicode前後](http://kunststube.net/frontback/) – deceze 2013-04-09 03:21:04

回答

6

下面的代碼適用於我。

$sql = "SELECT * FROM chartest"; 
mysql_set_charset("UTF8"); 
$rs = mysql_query($sql); 
header('Content-type: text/html; charset=utf-8'); 
while ($row = mysql_fetch_array($rs)) { 
    echo $row['name']; 
} 
+0

arg! 「mysql_set_charset(」 UTF8 「);」 DID解決了這個問題。就在不使用htmlentities()的時候。我沒有意識到htmlentities()也需要指定字符集,如下所述:http://stackoverflow.com/questions/9103801/htmlentities-converts-trademark-into-acirccent – 2013-04-09 05:50:22

0

有幾件事可能會有所幫助。首先,即使你將標題中的字符集設置爲UTF-8,這可能還不夠。我以前見過瀏覽器忽略它。嘗試通過在HTML的頭部加上這迫使:

<meta charset='utf-8'> 

其次,如前所述here,試試這樣做:

mysql_query ("set character_set_client='utf8'"); 
mysql_query ("set character_set_results='utf8'"); 
mysql_query ("set collation_connection='utf8_general_ci'"); 

編輯

所以我剛剛做了有些人讀了一下玩了一下。首先讓我告訴你,儘管我在評論中提到,utf8_encode()utf8_decode()不會幫你在這裏。它有助於真正理解UTF-8編碼。我發現維基百科頁面UTF-8非常有幫助。假設你從數據庫中得到的值實際上已經是UTF-8編碼了,你只需在獲得它後立即將其轉儲出來,那麼它應該沒問題。

如果您對數據庫結果做任何事情(特別是以任何方式操縱字符串),並且您不使用PHP mbstring庫中的感知unicode的函數,那麼它可能會混亂起來,因爲標準的PHP字符串函數不是unicode意識到的。

一旦你理解了UTF-8編碼是如何工作的,你可以做這樣的一些很酷的東西:

$test = "™"; 
for($i = 0; $i < strlen($test); $i++) { 
    echo sprintf("%b ", ord($test[$i])); 
} 

哪個轉儲出這樣的事:

11100010 10000100 10100010 

這是一個正確編碼UTF-8' ™'角色。如果您從數據庫中檢索到的數據中沒有像這樣的字符,則會出現一些問題。

要檢查,嘗試搜索您知道特殊字符在結果使用mb_strpos()

var_dump(mb_strpos($db_result, '™')); 

如果從數據庫是罰款返回比false則數據的其他任何東西,否則我們可以在最少確定它是PHP和數據庫之間的問題。

+0

添加後沒有任何變化。添加其他東西后,問題似乎變得更糟。取代「 」for™,我得到了「⢢」。 – 2013-04-09 03:51:22

+0

爲了確保頁面上的字符編碼設置正確,如果您使用的是Firefox,您可以右鍵單擊頁面並轉到顯示編碼的「查看頁面信息」。它顯示'UTF-8'還是'ISO-8859-1'? – 2013-04-09 03:56:30

+0

我並不是字符編碼的專家,但我已經使用過它。我不知道它是否會有所幫助,但是您應該查看一些與unicode相關的PHP函數,如[utf8_decode](http://php.net/manual/en/function.utf8-decode.php)和[mbstring](http://php.net/manual/en/book.mbstring.php)函數。 – 2013-04-09 04:00:41

-2

您需要先執行以下查詢。

mysql_query("SET NAMES utf8"); 
+0

請不要使用它,它可以在某些情況下創建SQL注入問題。使用OP已經完成的「官方」'mysql_set_charset' API。 – deceze 2013-04-09 04:06:06

+0

但我認爲[這個問題/答案](http://stackoverflow.com/a/7073506)正好相反嗎? – 2016-02-16 09:29:16

相關問題