我试图从 db 获取一些数据,但输出不是我所期望的。
在数据库上做我自己的查询,我得到这个输出:string 'C�te d�Ivoire' (length=13)
从 phpmyadmin 查询数据库我得到正常输出:科特迪瓦
php.ini 默认字符集、mysql db 默认字符集、<meta>
字符集都设置为 utf-8 。
我无法确定在哪里进行编码,因为我得到具有相同配置的不同输出。
PS:使用mysqli驱动。
我试图从 db 获取一些数据,但输出不是我所期望的。
在数据库上做我自己的查询,我得到这个输出:string 'C�te d�Ivoire' (length=13)
从 phpmyadmin 查询数据库我得到正常输出:科特迪瓦
php.ini 默认字符集、mysql db 默认字符集、<meta>
字符集都设置为 utf-8 。
我无法确定在哪里进行编码,因为我得到具有相同配置的不同输出。
PS:使用mysqli驱动。
在给您错误结果的同一页面中,请先尝试运行此指令
print base64_encode("Côte");
正确答案是Q8O0dGU...
。如果您得到其他内容,例如Q/R0ZQo...
,这意味着您的脚本正在使用另一个字符集(此处为 Latin-1)而不是 UTF-8。仍然有可能MySQL 和浏览器也在耍花招,但上面的行确保PHP 和/或您的编辑器在欺骗您。
接下来,Côte
从数据库中提取并输出其base64_encode
. 如果您看到Q8O0...
,那么 MySQL 和 PHP 之间的连接是安全的 UTF8。如果没有,那么可能还需要其他任何东西,您需要更改 MySQL 字符集(SET NAMES utf8
和/或ALTER
表和数据库排序规则)。
如果 PHP 是 UTF8,而 MySQL 是 UTF8,你仍然看到无效字符,那么它是 PHP 和浏览器之间的东西。验证内容类型标头是否正确发送;如果没有,请尝试将其作为脚本中的第一件事发送:
Header('Content-Type: text/html; charset=UTF8');
例如在 Apache 配置中你应该有
AddDefaultCharset utf-8
还要确认您的浏览器未设置为同时覆盖服务器字符集和自动检测。
注意:根据经验,如果您得到一个带有问号而不是 UTF8 国际字符的菱形,这意味着 UTF8 阅读器收到了无效的 UTF8 代码点。换句话说,显示菱形的实体(您的浏览器)期待 UTF8,但正在接收其他内容,例如 Latin1 aka ISO-8859-15。
另一种难以跟踪的获取该错误的方法是,如果输出以某种方式包含字节顺序标记 (BOM)。如果您创建一个文件,例如
###<?php
Header("Content-Type: text/html; charset=UTF8");
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF8" />
</head>
<body>
Hellò, world!
</body>
</html>
其中### 是(在大多数编辑器中不可见)UTF8 BOM。要删除它,如果编辑器允许,您需要将文件另存为“无 BOM”,或者使用其他编辑器。
如果您使用命令行工具 mysql 进行“自己的查询”,您也必须设置 option --default-character-set=utf8
。否则,请告诉我们您如何进行自己的查询。