【发布时间】:2013-04-22 09:43:28
【问题描述】:
我刚刚从mysql 5.5升级到5.6,5.6版本的默认编码是UTF-8。
所有的 ajax 请求也是用 UTF-8 处理的,所以我决定将数据库中的数据和网站上的编码转换为 UTF-8。
但现在我遇到了一个问题。网站上的所有特殊(unicode)字符都显示不正确。它们显示为编码的 UTF-8 字符串(双字节)
整个网站都是 100% 使用 jquery 构建的,所有字符串都是由 ajax 请求提供并用 jquery 附加/编写的......我不知道我做错了什么?!
数据库连接
$dbh = new PDO($driver.':dbname='.$db.';host='.$host.';port='.$port.';charset=utf8', $user, $pass);
数据库中的所有表和列都转换为UTF-8_bin
HTML 编码
header('Content-Type: text/html; charset=utf-8');
<meta charset="utf-8" />
HTML 页面以 UTF-8 编码。既从 PHP 发送标头,又在 HTML 文档的标头中添加了元标记
Ajax 请求
header('Content-Type: application/json; charset=utf-8');
{
type : 'post',
async : true,
cache : false,
dataType : 'json',
timeout : 15000,
contentType : 'application/x-www-form-urlencoded;charset=utf-8',
global : true,
url : APIURL,
data : {},
success : function(){}
}
所有的 Ajax 请求都是使用这些属性发出的
Ajax 响应
{"result":[{"id":"391","string":"BTN_ADD_ACCOUNTS","da":"Tilf\u00c3\u00b8j regnskab","en":"Add accounts"},{"id":"321","string":"BTN_ADD_ENTRY" ...
值Tilf\u00c3\u00b8j regnskab在页面上应该显示为Tilføj regnskab,但显示为Tilføj regnskab
在 phpmyadmin 中浏览数据库时,所有数据均正确显示
我可以通过Ajax请求将数据放入数据库并且数据存储正确,但无法通过Ajax请求检索数据
更新 - 数据库获取
header('Content-Type: text/html; charset=utf-8');
$connect = $driver.':dbname='.$db.';host='.$host.';port='.$port.';charset=utf8';
$dbh = new PDO($connect, $user, $pass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $dbh->prepare("SELECT da FROM lang WHERE string='HDL_CLIENT'");
$sth->execute();
$row = $sth->fetch(PDO::FETCH_ASSOC);
print_r($row);
// result
klient æå
【问题讨论】:
-
您是否已将所有文件重新保存为 UTF-8?您是否为 UTF-8 生成 Content-Type 标头?
-
如果你的意思是源文件?那应该没有影响吧?!所有数据都是从 ajax 请求提供的,并且是从数据库中获取的。源文件中没有保存数据/字符串。文件只包含代码......或者我错了吗? :)
-
是的..
header('Content-Type: text/html; charset=utf-8'); -
说实话,涉及的步骤太多,因此很难提供一般性建议。您可以查看 SO 经典 UTF-8 all the way through 以查看您是否遗漏了某些内容并使用您最喜欢的浏览器工具集来检查 HTTP 请求。
-
不,
Tilf\u00c3\u00b8j regnskab不是你想要的!相反,你想要Tilf\u00f8j regnskab。