【问题标题】:PHP/MySQL with encoding problemsPHP/MySQL 有编码问题
【发布时间】:2010-09-29 04:09:56
【问题描述】:

我在使用 PHP 时遇到了编码问题。

我有一个使用 $.post 与我的 PHP 脚本交互的 JavaScript/jQuery HTML5 页面。 然而,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';

不仅 í 字符失败,而且没有任何“特殊”字符的字符串也失败。 从 SET NAMES 和 SET CHARACTER SET 中删除 ' 字符似乎没有任何改变。

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

编辑 2:我正在使用 MySQL 版本 5.1.30 的 XAMPP for Linux。

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

输出一个空数组。

【问题讨论】:

    标签: php mysql encoding utf-8


    【解决方案1】:

    指定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 中的字符集和排序规则。

    【讨论】:

    • PhpMyAdmin 说我要获取的字段是使用 utf8_bin 编码的,我认为这就足够了。不过,我会试试你的解决方案。
    • 该字段以 UTF 编码,但您需要确保连接使用相同的编码(出于某种原因默认为 ISO-8859)
    • 谢谢。但它仍然无法正常工作。我更新了我的问题并添加了更多详细信息。
    • 你用的是什么版本的 MySQL?
    • 我正在使用 5.1.30 (XAMPP for Linux) /opt/lampp/bin/mysql --version /opt/lampp/bin/mysql Ver 14.14 Distrib 5.1.30, for pc-linux -gnu (i686) 使用 EditLine 包装器我会将此信息添加到帖子中。
    【解决方案2】:

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

    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】:

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

    在我的情况下,它与服务器字符集/排序规则不一致。其他所有内容都设置为 utf8,但服务器字符集具有 latin1。这导致在数据库中输入的所有 utf8 数据都以原始编码形式显示,例如 L í 将等于带波浪号的 A 〜 ...

    我正在使用 mysqli,为了修复它,我使用了上面 Anthony Accioly 解释的方法(使用 mysql_set_charset)。所述方法有一个mysqli 版本,这就是我使用的。

    在那之后,我很困惑。查看我的网站时,我仍然一团糟。当然,我不知道通过将 latin1 更改为 utf8 我也会弄乱整个字符的编码/解码。所以我使用online string encoder/decoder 的帮助来修复我的表数据。

    我对我的所有内容数据进行了各种导出(您可以将它们设置为获取更新查询,这样更新过程会更快)并通过上述在线编码器/解码器运行 sql 输出,然后复制粘贴修复了 phpmyadmin sql 面板上的查询...从而修复了我的编码错误。现在一切都应该是这样,并且我能够再次处理有损搜索:Maria、maria、maria、maria 都将匹配 maría、maria、Maria 等。所有尖锐字符都评估为它们的基本元音字符。大胜。

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 2013-04-25
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多