我لاہور
在 MySQL 中存储 Unicode 文本,我已将表和列设置为 utf8_general_ci。文本لاہور
在 MySQL 中正确显示。但是,如果我用 PHP 回应它,它会显示??????
在浏览器窗口上。
这里要提一件事:我有整个 Unicode 文档,所有单词都正确显示,但它们是直接编写的,即不是来自 MySQL。
即使我尝试
$p="لاہور";
echo $p;
它显示لاہور
在浏览器中。只有在从 MySQL 中检索时才会出错。
使用元标记设置内容类型可能并不总是足够的,我通常通过 header 指令以及下面的方式设置它。
header('Content-Type: text/html; charset=utf-8');
很可能您的 MySQL连接(而不是存储)没有设置为 UTF-8,导致从 MySQL 检索到的 UTF-8 数据被转换为 Latin1(或类似),它不能代表这些字符,它们被替换为?
.
如果您正在使用mysql_
:
mysql_set_charset( 'utf8' );
如果您正在使用mysqli_
:
$mysqli->set_charset( 'utf8' );
在您进行任何查询之前
如果您正在使用PDO
,请添加charset=utf8
到连接字符串。
造成这种情况的一个常见原因是您的 PHP 脚本正在以另一种格式(例如 ASCII)保存,您必须确保您的 PHP 脚本也保存为 UTF-8 或您在数据库中使用的任何编码。
另一个可能的原因是 MySQL 没有向您的脚本返回正确的 Unicode 字符,您可以使用mysql_query("SET NAMES utf8")
或您想使用的任何编码,在处理您的查询之前,解决此问题的一个好方法可能是将字符串转换为它们各自的 unicode 代码和比较它们,看看它们是否相同。