2012-03-13 31 views
2

在MySQL中,我有一個字符串,它在phpmyadmin中正確顯示,排序規則設置爲utf8_general_ci通過PHP從MySQL獲取UTF-8字符串返回「????????」

在PHP文件,我已經使用普通的HTML設置頁眉:

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

PHP文件都在Ubuntu,Apache 2.2的託管,並且這些文件(使用記事本++)

保存在 UTF-8 without BOM

我已經設置爲使用UTF-8的連接:

@mysql_query("set names 'utf8'", $this->link); 
$r = @mysql_query($query, $this->link); 

它返回的字符串(VARCHAR 255)和美國在PHP回顯中,它會顯示給瀏覽器。

但是,我仍然是?????而不是實際的單詞。

我似乎無法搜索我可能錯過的內容,非常感謝您的幫助。

=====編輯=====

數據庫,表和列可以有三種不同的排序規則,我已經將它們都以utf8_general_ci,並調用mysql_set_charset(「UTF-8」)立即連接後製成了,解決了我的問題。

我希望這將作爲一個有用的清單,爲未來的人碰到同樣的問題。我一個人可能會很好地在幾個月內回來檢查我是否錯過了任何東西:)

感謝所有的偉大的投入。

+0

你確定它們被正確存儲嗎? – 2012-03-13 15:35:08

+0

是否使用UTF-8管道插入數據?即使輸出管道始終是正確的utf8,數據庫插入之前/期間數據可能已損壞。 – 2012-03-13 15:35:11

+0

你還有其他文字(不是來自數據庫)的正確或有問題的標記嗎? – 2012-03-13 15:43:38

回答

2

確保您的表位於utf8_general_ci。 數據庫和表可以有不同的字符集 (可以在您自己更改時發生)。

並小心一些功能,如ヶ輛, 其具有設置爲ISO-8859-1爲PHP默認字符集參數< 5.4.0 (設置爲UTF-8爲PHP> 5.4.0)

http://php.net/manual/en/function.htmlentities.php

+0

可能是錯誤的,但我相信PHP 5.3更新了這些函數的默認字符集參數爲UTF-8。 – 2012-03-13 16:21:20

+0

這裏是PHP文檔的有用部分:''和htmlspecialchars()一樣,htmlentities()採用可選的第三個參數編碼,它定義了轉換中使用的編碼。如果省略,則此參數的缺省值是5.4.0之前的PHP版本中的ISO-8859-1,而PHP 5.4.0及之後的版本是UTF-8。儘管這種說法在技術上是可選的,但是我們強烈建議您爲您的代碼指定正確的值。「 – zessx 2012-03-13 20:42:21

+0

謝謝。我沒有意識到數據庫,表格,列可以有** 3種不同的排序**。我將所有內容都設置爲utf8_general_ci,並將@jeroen建議的正確字符集設置爲已解決此問題。 – Gapton 2012-03-14 03:29:58

2

我覺得周圍'utf8'的報價是錯誤的,但無論哪種方式,你可以使用:

mysql_set_charset('utf8'); 

而抑制與當你正在尋找他們的@操作的失誤,是不是一個好主意。

-1

檢查像這樣的查詢之前

mysql_query('SET character_set_results=utf8'); 
mysql_query('SET names=utf8'); 
mysql_query('SET character_set_client=utf8'); 
mysql_query('SET character_set_connection=utf8'); 
mysql_query('SET character_set_results=utf8'); 
mysql_query('SET collation_connection=utf8_general_ci'); 
+0

這是過度殺傷。單獨設置名字就足夠了 – 2012-03-13 15:49:17

-1

你可以用這個編碼字符串爲UTF-8,因此不會得到???,但會改變非urf-8字符就像這樣/ u003。所以你可以稍後將其解碼以在文本上呈現它

while($var=mysql_fetch_assoc($r)){ 
      $e['columnI']=utf8_encode($e['columnI']);