代码之家  ›  专栏  ›  技术社区  ›  luiscubal

PHP/MySQL存在编码问题

  •  5
  • luiscubal  · 技术社区  · 17 年前

    我在PHP编码方面遇到了问题。

    我有一个JavaScript/jQuery HTML5页面,可以使用$与我的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不包含íchar,按预期工作,但如果有任何íchar,则不包含。

    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失败,而且对没有任何“特殊”字符的字符串也失败。 从集合名称和集合字符集中删除“char”似乎不会改变任何东西。

    我正在使用PDO连接MySQL数据库。

    编辑2:我使用的是Linux版XAMPP的MySQL版本5.1.30。

    编辑3:跑步 SHOW VARIABLES LIKE '%character%' 从PhpMyAdmin输出

    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%'
    

    输出一个空数组。

    3 回复  |  直到 17 年前
        1
  •  18
  •   Eran Galperin    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 .

        2
  •  7
  •   Anthony Accioly    15 年前

    后期复兴。 但为了进一步参考,这里有一些额外的提示:

    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 使用不同编码的指令对主机管理员大喊大叫。
        3
  •  1
  •   EffectiX    13 年前

    我刚刚遇到了这个问题。我有一个完整的西班牙语网站内容,里面有你能想到的所有特殊字符(áëíóú)及其大写字母版本。

    在我的例子中,它与服务器字符集/排序规则不一致。除服务器字符集外,其他所有设置都设置为utf8,其中包含拉丁文1。这导致数据库中输入的所有utf8数据以其原始编码形式显示,likeLí将等于A和tilde~。。。

    我正在使用mysqli,为了修复它,我使用了上面Anthony Accioly解释的方法(使用mysql_set_charset)。该方法具有一定的实用价值 mysqli 版本,这就是我使用的版本。

    在那之后,我感到困惑。我在浏览我的网站时还是一团糟。当然,我不知道把拉丁语改成utf8也会把整个事情的字符编码/解码搞砸。所以我用了一个 online string encoder/decoder 来修复我的表数据。

    我对我的所有内容数据进行了各种导出(你可以设置它们以获得更新查询,这将加快你的更新过程),并通过上述在线编码器/解码器运行sql输出,然后在phpmyadmin sql面板上复制粘贴固定查询。。。从而修正了我的编码错误。现在一切都正常了,我可以再次处理有损搜索:Maria、Maria、Maria、Maria、mariá都将匹配Maria、Maria、Maria等。所有尖锐的字符都评估为其基本元音字符。史诗般的胜利。