【问题标题】:How to handle UTF-8 in javascript strings如何处理 JavaScript 字符串中的 UTF-8
【发布时间】: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

标签: php jquery mysql


【解决方案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) );

【讨论】:

  • ok.. :) 但是在 phpmyadmin 中浏览数据库时,所有特殊字符都会正确显示..
  • 我现在做了一个小测试。检查我的问题更新。已经粘贴了从数据库中获取数据的 php 代码
  • @clarkk - 1) 你的 PHP 版本是什么? 2) var_dump( bin2hex($row) ); 打印什么?
  • 正在使用 php 5.4.3.. 结果 string(22) "4b6c69656e7420c3a6c3a5" ... 纯文本字符串 Klient æå
  • 已确认。在 UTF-8 中,æ 是 c3a6,å 是 c3a5。你俩都在那里。你的桌子根本没有任何ø。一切看起来都是 100% 正确的 UTF-8。它只是没有你认为的数据。现在,这些无效数据是如何首先插入的?为什么 phpMyAdmin 显示不正确?你能重现错误的插入吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2011-10-25
  • 2020-01-20
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多