相同的数据集输出不同的字符:phpmyadmin/own query



我试图从数据库中获取一些数据,但输出不是我所期望的
我自己在数据库上进行查询,得到的输出是:string 'C�te d�Ivoire' (length=13)

从phpmyadmin查询数据库我得到正常输出:科特迪瓦

php.ini默认字符集、mysql-db默认字符集和<meta>字符集都设置为utf-8。

我不能把它从编码的地方弄出来,因为我用相同的配置得到不同的输出。

附言:使用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 a.k.a.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进行"自己的查询",则还必须设置选项--default-character-set=utf8。否则,请告诉我们您是如何进行自己的查询的。

最新更新