UTF8 - PHP 和 MySQLi UTF8

27

我的表字符集是utf8,排序规则也是utf8。现在我有如下代码:

   $mysqli = new mysqli("localhost", "root", "", "Amoozeshgah");

            if (mysqli_connect_errno()) {
                  printf("Connect failed: %s\n", mysqli_connect_error());

            }
          if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
    printf("Current character set: %s\n", $mysqli->character_set_name());
}
        mysql_set_charset('utf8');
            if ($stmt = $mysqli->prepare("SELECT About_Title FROM Tbl_About WHERE About_Id=?")) {
                $city = 8;

               /* bind parameters for markers */
                $stmt->bind_param("s", $city);

              /* execute query */
                $stmt->execute();

               /* bind result variables */

                  $result = $stmt->get_result();

             /* fetch value */
            while ($myrow = $result->fetch_assoc()) {

        // use your $myrow array as you would with any other fetch
        printf("%s is in district %s\n", $city, $myrow['About_Title']);
        print("shod");

    }

但输出结果是:
Current character set: utf8 8 is in district نتمنتشس shod

我可以帮您做些什么呢? 编辑: 我替换了:

if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
    } else {
        printf("Current character set: %s\n", $mysqli->character_set_name());
    }
            mysql_set_charset('utf8');

使用

$mysqli->set_charset("utf8")

但是没有任何区别。


你的数据库/表设置了utf8排序规则吗? - tonymarschall
6个回答

59
请将 mysql_set_charset('utf8'); 替换为 $mysqli->set_charset("utf8") :-)


4
你在输出的页面头部使用了UTF-8编码吗? - Rohit Choudhary
2
最好使用 utf8mb4 而不是 utf8 - Flimm

27
or mysqli_set_charset($this->mysqli,"utf8");
mysqli_set_charset($conn,"utf8");

2

如果您在代码中使用“json_encode”,请注意:

json_encode($rows);

只需将其更改为:
json_encode($rows,JSON_UNESCAPED_UNICODE);

0

有趣的情境可能会帮助其他人。没有技术细节/解释,只是为了推动/指引方向。

情境:基于成功/已验证IPN PayPal交易的远程自动创建用户帐户。 mysqli查询创建用户和用户元数据,但该数据的值包含隐藏的格式字符,并且使调用表单处理中的该数据无效。非常简单的解决方案,而不需要更改/修改任何现有的DB表格。基本上,这确保您的数据仅为ASCII可打印字符,即使使用$ mysqli-> set_charset("utf8")也并不重要,因为您正在准备好处理和输入“ASCII干净”的数据。

    $create_ipn = $mysqli->prepare("INSERT INTO xxx_somewhere (some_ipn_parameter , email, domain, item) VALUES (?, ?, ?, ?)");
    $create_ipn->bind_param("ssss", $some_ipn_parameter, $email, $domain, $item);

    $some_ipn_parameter = preg_replace( '/[^\x01-\x7F]/', "", 'the_actual_ipn_data' );
    $email = 'edward@ait-pro.com';
    $domain = '';
    $item = 'Test';
    $create_ipn->execute();         

0

从数据库获取数据时,不仅需要正确地获取数据,还需要在页面上正确地显示它,因此请尝试在页面头部使用UTF-8编码:

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

<meta charset="utf-8">

这是我的问题和解决方案,感谢Rohit Kumar Choudhary。


-1
在你的 PHP 文件中,在代码顶部添加以下内容。
header('Content-Type: text/plain; charset=utf-8');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接