2009-01-01 156 views
4

我有關於編碼PHP麻煩的編碼問題。PHP/MySQL與

我有一個JavaScript/HTML5 jQuery的頁面使用.post的$我的PHP腳本交互。 但是,PHP正面臨一個奇怪的問題,可能與編碼有關。

當我寫

htmlentities("í") 

我希望PHP輸出í。然而,而是輸出í 在開始的時候,我以爲我做一些錯誤與編碼,但是

htmlentities("í")=="í"?"Good":"Fail"; 

被outputing「失敗」,其中

htmlentities("í")=="í"?"Good":"Fail"; 

htmlentities($search, null, "utf-8")作品如預期。

我想有PHP與MySQL服務器進行通信,但是它有編碼的問題也一樣,即使我使用函數utf8_encode。我該怎麼辦?

編輯:在SQL命令,寫

SELECT id,uid,type,value FROM users,profile 
WHERE uid=id AND type='name' AND value='XXX'; 

其中XXX不含í字符,按預期工作,但事實並非如此,如果有任何「I」字符。

SET NAMES 'utf8'; 
SET CHARACTER SET 'utf8'; 
SELECT id,uid,type,value FROM users,profile 
WHERE uid=id AND type='name' AND value='XXX'; 

不僅失敗的字符,但它也沒有任何'特殊'字符的字符串失敗。 刪除SET NAMES和SET CHARACTER SET中的字符似乎沒有改變任何東西。

我連接到MySQL數據庫使用PDO。

編輯2:我使用的Linux XAMPP的MySQL版本5.1.30。

編輯3:從phpMyAdmin的運行SHOW VARIABLES LIKE '%character%'輸出

character_set_client utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results utf8 
character_set_server latin1 
character_set_system utf8 
character_sets_dir /opt/lampp/share/mysql/charsets/ 

從我的PHP腳本運行相同的查詢(用的print_r)輸出:

Array 
(
    [0] => Array 
     (
      [Variable_name] => character_set_client 
      [0] => character_set_client 
      [Value] => latin1 
      [1] => latin1 
     ) 

    [1] => Array 
     (
      [Variable_name] => character_set_connection 
      [0] => character_set_connection 
      [Value] => latin1 
      [1] => latin1 
     ) 

    [2] => Array 
     (
      [Variable_name] => character_set_database 
      [0] => character_set_database 
      [Value] => latin1 
      [1] => latin1 
     ) 

    [3] => Array 
     (
      [Variable_name] => character_set_filesystem 
      [0] => character_set_filesystem 
      [Value] => binary 
      [1] => binary 
     ) 

    [4] => Array 
     (
      [Variable_name] => character_set_results 
      [0] => character_set_results 
      [Value] => latin1 
      [1] => latin1 
     ) 

    [5] => Array 
     (
      [Variable_name] => character_set_server 
      [0] => character_set_server 
      [Value] => latin1 
      [1] => latin1 
     ) 

    [6] => Array 
     (
      [Variable_name] => character_set_system 
      [0] => character_set_system 
      [Value] => utf8 
      [1] => utf8 
     ) 

    [7] => Array 
     (
      [Variable_name] => character_sets_dir 
      [0] => character_sets_dir 
      [Value] => /opt/lampp/share/mysql/charsets/ 
      [1] => /opt/lampp/share/mysql/charsets/ 
     ) 

) 

運行

SET NAMES 'utf8'; 
SET CHARACTER SET 'utf8'; 
SHOW VARIABLES LIKE '%character%' 

輸出空陣列。

回答

17

指定的htmlentities編碼匹配輸入的,它是非常重要的,因爲你在最後的例子一樣,但在前三省略。

htmlentities($text,ENT_COMPAT,'utf-8'); 

關於與MySQL的通信,您需要確保連接排序規則和字符集與您傳輸的數據相匹配。您可以設置此配置文件中,或者使用下面的查詢,在運行時:

SET NAMES utf8; 
SET CHARACTER SET utf8; 

確認表,數據庫和服務器字符集一致爲好。有一個設置在運行時不能更改,並且這是服務器的字符集。您需要修改它的配置文件中:

[mysqld] 
character-set-server = utf8 
default-character-set = utf8 
skip-character-set-client-handshake 

在MySQL in the manual更多的字符集和歸類。

+0

PhpMyAdmin說我試圖得到的字段是使用utf8_bin編碼的,我認爲這就足夠了。不過,我會嘗試你的解決方案。 – luiscubal 2009-01-01 23:51:27

+0

該字段使用UTF編碼,但您需要確保連接使用相同的編碼(出於某種原因,缺省值爲ISO-8859) – 2009-01-01 23:54:42

7

後期復興。 但對於進一步參考這裏有一些小竅門:

  1. 使用mysql_set_charset,而不是SET xxx
  2. 確保您使用UTF-8編碼的文件(這往往被忽視)
  3. 套頭:
    <?php header("Content-type: text/html; charset=utf-8"); ?>

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

  4. 如果你的Apache SER ver配置包含一個不同編碼的AddDefaultCharset指令在您的主機管理員處大喊。
1

我剛碰到這個問題。我有一個西班牙語整個網站的內容,所有你可以期待的特殊字符(áéíóúñ)和他們的大寫字母版本。

在我的情況下,這是與服務器字符集/整理不一致。其他一切都設置爲utf8,但服務器charset,它有latin1。這導致在數據庫中輸入的所有utf8數據以其原始編碼形式顯示,就像Lí會等於一個帶波浪號的A ...

我正在使用mysqli,並修復它,我使用瞭解釋的方法以上由Anthony Accioly(使用mysql_set_charset)完成。該方法有一個mysqli版本,這就是我使用的。

之後,我感到困惑。瀏覽我的網站時我仍然一團糟。當然,我不知道通過將latin1改爲utf8我也會弄亂整個事物的字符編碼/解碼。所以我用online string encoder/decoder的幫助來修復我的表格數據。

我對所有內容數據進行了各種導出(您可以設置它們以獲取更新查詢,並且更新過程會更快),並通過上述在線編碼器/解碼器運行sql輸出,然後複製粘貼在phpmyadmin sql面板上的固定查詢...從而修復我的編碼錯誤。現在一切都應該如何,我能夠再次處理有損搜索:瑪麗亞,瑪麗亞,瑪麗亞,瑪麗亞都會匹配瑪麗婭,瑪麗亞,瑪麗亞等等。所有尖銳的人物都會評估他們的基礎元音字符。大勝。