当前位置: 首页 > 面试题库 >

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

山寒
2023-03-14
问题内容

我有一个stdClass称为的对象$post,当通过进行转储时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:

  • 打电话mysql_set_charset("utf8"),如果你使用的时候,弃用API。
  • mysqli_set_charset("utf8")如果使用mysqli则调用
  • 如果使用PDO和PHP> = 5.3.6,则将charset参数添加到连接字符串中。在早期版本中,您需要执行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。所以我使用了json_encode()。 我使用此处给出的表格-http: //www.geekality.net/2011/08/21/country-names-continent- names-and-iso-3166-codes-for- mysql/ 对于不同的输入,此代码的行为似乎有所不同。 查询- 不返回任何json值

  • 我希望下面的代码在其中一个方法<code>callfuture1()</code>或<code>callfuture2()</code>抛出异常时返回自定义消息。我的理解是,如果任何一个未来失败,都将是失败的未来。 但是,当 引发异常时。 不执行。相反,我看到调用堆栈停止在 中的代码行,其中发生了异常并返回了标准内部错误。为什么会这样? ====更新==== 我从响应中看到,潜在的问题是异常被抛出

  • 我一直在尝试使用S3.Object.put()方法以编程方式将SNS消息上载到S3 bucket,如下所示: 这不起作用,所以我尝试了以下方法,尝试将一个对象上传到一个特定的S3 bucket。 然而,这两种方法都在默默地失败。我没有收到任何访问拒绝、错误消息等,但我也没有将我的消息上传到bucket。我不确定每次调用函数都会发生什么,希望能为那些通过编程成功地将文件上传到bucket的人提供指导

  • 我在fastapi里使用绝对地址引入一个类,会报错?为什么呢,我看别人都是可以的 百度过很多了,都没解决,有大佬帮忙看看吗?

  • 问题内容: [编辑:此问题仅适用于32位系统。 如果您的计算机,操作系统和python实现是64位的,则映射大型文件将可靠且非常有效。] 我正在编写一个模块,该模块除其他功能外,还允许对文件进行按位读取访问。这些文件可能很大(数百GB),因此我编写了一个简单的类,使我可以像对待字符串一样对待文件,并隐藏所有查找和读取内容。 当时我写了包装类,我对mmap模块一无所知。在阅读mmap的文档时,我认为