JSON编码和卷曲引号

时间:2011-09-23 14:55:34

标签: php quotes json

我在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"}

3 个答案:

答案 0 :(得分:5)

从来没有遇到过这个特定问题(即使用json_encode())但是一个简单的 - 虽然有点难看 - 我在其他地方使用的解决方案是遍历你的数据并通过我从某个地方获得的这个函数传递它(当我发现我得到它的时候会信用它:)

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

答案 1 :(得分:2)

json_encode有一种讨厌的习惯,即默默地删除它找不到的字符串(即非UTF8)字符。(参见此处了解背景:How to keep json_encode() from dropping strings with invalid characters

我的猜测是卷曲引号是错误的字符集,或者沿途转换。例如,可能是您的数据库连接是ISO-8859-1编码。

您能否以何种格式说明数据的来源?

答案 2 :(得分:1)

如果我需要这样做,我首先将文本复制到记事本中,然后从那里复制它。记事本强制它是正常的引号。从来没有通过代码来做到这一点......