php - 为什么对 json_encode 的 PHP 调用默默失败 - 无法处理单引号?

标签 php json

我有一个名为 $poststdClass 对象,当通过 print_r() 转储时,返回以下内容:

stdClass Object (
    [ID] => 12981
    [post_title] => Alumnus' Dinner Coming Soon
    [post_parent] => 0
    [post_date] => 2012-01-31 12:00:51
)

回显在此对象上调用 json_encode() 的结果会产生以下结果:

{
    "ID": "12981",
    "post_title": null,
    "post_parent": "0",
    "post_date": "2012-01-31 12:00:51"
}

我假设带有单引号的内容导致 json_encode 阻塞,但我不知道需要什么格式来转义它。有什么想法吗?

编辑:修复了代码示例中的不匹配问题。我正在运行 PHP 版本 5.3.8

EDIT2:在对对象进行编码后,我立即执行了以下操作:

echo json_last_error() == JSON_ERROR_UTF8;

这打印了1,这意味着发生了以下错误:“格式错误的UTF-8字符,可能编码错误”。 json_last_error()

EDIT3:在帖子标题上调用 utf8_decode() 会产生以下结果:“校友?晚餐即将到来”。该数据是从 MySQL 数据库中提取的 - 特别是帖子标题是一个文本字段,采用 UTF-8 编码。也许这个单引号编码不正确?问题是,我有一个 SQL GUI 应用程序,并且它在其中显示正确。

最佳答案

执行查询前需要设置连接编码。如何完成此操作取决于您用于连接的 API:

  • 如果您使用old, deprecated API,请调用mysql_set_charset("utf8") .
  • 如果您使用mysqli,请调用mysqli_set_charset("utf8")
  • 添加charset parameter如果您使用 PDO 且 PHP >= 5.3.6,则添加到连接字符串。在早期版本中,您需要执行SET NAMES utf8

当您从 MySQL 获取数据时,任何文本都将以“客户端编码”进行编码,这可能是 windows-1252如果你不进行其他配置。导致问题的字符是“弯引号”,在十六进制转储中显示为 92,它确认 mysql 客户端正在对 windows-1252 中的文本进行编码。

您可能会考虑的另一件事是通过 utf8_encode 传递所有文本,但在这种情况下,它不会产生正确的结果。 PHP 的 utf8_encode 转换 iso-8859-1 编码文本。在此编码中,\x92 是不可打印的控制字符,它将被转换为 utf-8 中的不可打印的控制字符。您可以使用 str_replace("\x92", "'", $input) 来解决此特定字符的问题,但如果数据库中可能存在任何其他非 ascii 字符您需要让客户端使用 UTF-8。

关于php - 为什么对 json_encode 的 PHP 调用默默失败 - 无法处理单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017040/

相关文章:

arrays - 快速发送数组到Web服务参数

mysql - 如果存在特定 id,则将 json 值提取到列中

Android HttpClient 响应

php - ' -- +'的SQL注入(inject)函数

php - 帮助获取传递到 Jquery 自动完成插件的正确信息以获得可点击的结果

php - Laravel 作业被推送到队列事件

php - 强制 fputcsv 对*所有*字段使用外壳

php - Laravel:检查 Controller 上的数据是否为整数

jquery - 跨域 JSON 调用

ios - 在 UITableViewCell 内的 UICollectionViewCell 上显示 Json。 swift 3