[英]PHP/MySQL with encoding problems
我在編寫PHP時遇到麻煩。
我有一個JavaScript / jQuery HTML5頁面使用$ .post與我的PHP腳本交互。 但是,PHP面臨着一個奇怪的問題,可能與編碼有關。
當我寫作
htmlentities("í")
我希望PHP輸出í
。 然而,它輸出í
一開始,我認為我在編碼方面犯了一些錯誤
htmlentities("í")=="í"?"Good":"Fail";
正在輸出“失敗”,其中
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不包含任何字符,按預期工作,但如果有任何'í'字符則不然。
SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
SELECT id,uid,type,value FROM users,profile
WHERE uid=id AND type='name' AND value='XXX';
不僅沒有íchars,但它也沒有任何“特殊”字符的字符串失敗。 從SET NAMES和SET CHARACTER SET中刪除'字符似乎沒有任何改變。
我使用PDO連接到MySQL數據庫。
編輯2:我正在使用XAMPP for Linux的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%'
輸出一個空數組。
指定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
后期復興。 但為了進一步參考,這里有一些額外的提示:
SET xxx
設置標題:
<?php header("Content-type: text/html; charset=utf-8"); ?>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
我剛遇到這個問題。 我有一整個網站的西班牙語內容,包含您可以期待的所有特殊字符(áéíóúñ)和大寫字母版本。
在我的情況下,它與服務器charset / collation不一致。 其他所有設置為utf8,但服務器charset,其中有latin1。 這導致在數據庫中輸入的所有utf8數據以其原始編碼形式顯示,如Lí將等於A與波浪號〜...
我正在使用mysqli,為了修復它,我使用了Anthony Accioly上面解釋的方法(使用mysql_set_charset)。 所述方法有一個mysqli版本,這就是我使用的。
在那之后,我感到困惑。 查看我的網站時,我仍然一團糟。 當然,我不知道通過將latin1更改為utf8,我也會搞砸整個事物的字符編碼/解碼。 所以我使用在線字符串編碼器/解碼器的幫助來修復我的表數據。
我對我的所有內容數據進行了各種導出(您可以設置它們以獲取更新查詢,並且更新過程會更快)並通過前面提到的在線編碼器/解碼器運行sql輸出,然后復制粘貼固定查詢phpmyadmin sql panel ...從而修復我的編碼錯誤。 現在一切都應該如此,我能夠再次處理有損搜索:Maria,maria,maría,mariá將全部匹配maría,maria,Maria等。所有銳角字符都評估為他們的基本元音字符。 大勝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.