JSON 编码和大引号

Posted

技术标签:

【中文标题】JSON 编码和大引号【英文标题】:JSON Encode and curly quotes 【发布时间】:2011-11-23 18:21:02 【问题描述】:

我在json_encode() 的原生 php 5 实现中遇到了一个有趣的行为。显然,当将对象序列化为 json 字符串时,编码器将清除所有包含“弯”引号的字符串属性,这种类型可能会在启用自动转换的情况下从 MS Word 文档中复制粘贴出来。

这是函数的预期行为吗?我能做些什么来强迫这些类型的角色转换为他们的基本等价物?我已经检查了返回数据的数据库和插入数据的管理页面之间的字符编码不匹配,并且一切都设置正确 - 编码器似乎只是因为这些字符而拒绝了这些值。有没有其他人遇到过这种行为?

编辑:

澄清一下;

MSWord 将采用标准引号和撇号并将它们转换为更美观的“花式”或“卷曲”引号。当这些字符放置在其编辑界面(在 html 中)和数据库编码之间的字符集不匹配的内容管理器中时,可能会导致问题。

不过,这不是问题所在。例如,我有一个 json_object 代表一个人的个人资料和字符串:

Jim O’Shea

那个撇号的 UTF 代码是 \u2019

从数据库中取出并直接json_encoded时,json对象中会出现null。

"model_name":"Bio","logged":true,"BioID":"17","Name":null,"Body":"Profile stuff!","Image":"","Timestamp":"2011-09-23 11:15:24","CategoryID":"1"

【问题讨论】:

你能举个具体的例子吗? 我不确定您所说的“将任何包含'大括号'的字符串属性归零”是什么意思。但是,我测试了json_decode() 字符串'"a":"b,c,d"',它按预期工作。 @Jack curly 引号,不是大括号。 嗯...什么是“弯引号”? @Jack Maney:MS Word 智能引号 【参考方案1】:

json_encode 有一个讨厌的习惯,即默默地丢弃它发现无效(即非 UTF8)字符的字符串。(有关背景信息,请参见此处:How to keep json_encode() from dropping strings with invalid characters)

我的猜测是大引号的字符集错误,或者在此过程中被转换了。例如,您的数据库连接可能是 ISO-8859-1 编码的。

您能否说明数据的来源是什么格式?

【讨论】:

【参考方案2】:

从来没有遇到过这个特定的问题(即json_encode()),但是我在其他地方使用的一个简单的 - 尽管有点难看 - 解决方案是循环访问您的数据并通过我从某个地方获得的这个函数传递它(将归功于当我发现我在哪里得到它时它):

function convert_fancy_quotes ($str) 
  return str_replace(array(chr(145),chr(146),chr(147),chr(148),chr(151)),array("'","'",'"','"','-'),$str);

【讨论】:

【参考方案3】:

如果我需要这样做,我首先将文本复制到记事本中,然后从那里复制。记事本强制它是普通引号。不过,从来不需要通过代码来完成...

【讨论】:

以上是关于JSON 编码和大引号的主要内容,如果未能解决你的问题,请参考以下文章

用引号和大括号反应原生属性值

在 bash 脚本中转义引号和大括号的问题

如何将带单引号的字符串转换为双引号以进行 json 解析

JSON 编码器生成 JSON 消息在 BizTalk 2016 中添加空引号字符

转义引号和大括号时遇到问题

json_encode在编码字符串时会自动加上双引号,怎么能去掉?