簡體   English   中英

PHP / MySQL有編碼問題

[英]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

閱讀手冊中有關MySQL 字符集和排序規則的更多信息。

后期復興。 但為了進一步參考,這里有一些額外的提示:

  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服務器配置包含具有不同編碼的AddDefaultCharset指令,請向主機管理員大喊大叫。

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

在我的情況下,它與服務器charset / collat​​ion不一致。 其他所有設置為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM