4

我刚刚从 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 请求都是使用这些属性发出的

阿贾克斯响应

{"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 æå
4

1 回答 1

1

我没有注意到重要的一点。正如 icktoofay 指出的那样,您的 JSON 已经损坏:

>>> "Tilf\u00c3\u00b8j regnskab"
"Tilføj regnskab"

您有两个字符 ( \u00c3\u00b8) 来表示ø(这显然是一个字符)。由于 ø 是U+00F8它应该只是\u00f8

>>> "Tilf\u00f8j regnskab"
"Tilføj regnskab"

问题出在生成该 JSON 的 PHP 脚本中,而不是在使用它的 JavaScript 代码中。可能性:

  • 您的数据已在 DB 中损坏。
  • 您的数据在获取时被损坏。

ø 的 UTF-8 表示是“0xC3 0xB8 (c3b8)”。需要确保您看到这些字节。要打印十六进制值:

  • mysql -SELECT HEX(column_name) FROM table_name
  • PHP -var_dump( bin2hex($variable) );
于 2013-04-29T09:16:36.837 回答