JSON编码和花括号引号

3
我在使用本地PHP 5实现的json_encode()时遇到了一个有趣的问题。显然,在将对象序列化为JSON字符串时,编码器会将任何包含“花括号”引号的字符串属性设置为null,这些引号可能是启用自动转换的MS Word文档中复制粘贴的。
这个函数的预期行为是什么?我该怎么做才能强制将这些字符转换为它们的基本等价物?我已经检查过数据库返回数据和管理页面插入数据之间的字符编码不匹配,并且所有设置都正确 - 看起来编码器只是因为这些字符而拒绝这些值。还有其他人遇到过这种情况吗?
编辑:
为了澄清一下;
MSWord会将标准引号和撇号转换为更美观的“花式”或“卷曲”的引号。当这些字符放置在内容管理器中时,如果编辑界面(在HTML中)和数据库编码不匹配,则可能会导致问题。
但这里不是问题所在。例如,我有一个表示个人资料的json_object和字符串:
Jim O’Shea
该撇号的UTF代码为\u2019 从数据库获取并直接进行json编码时,它将为空值。
{"model_name":"Bio","logged":true,"BioID":"17","Name":null,"Body":"Profile stuff!","Image":"","Timestamp":"2011-09-23 11:15:24","CategoryID":"1"}

2
你能展示一个具体的例子吗? - Pekka
我不确定你所说的“将包含花括号的字符串属性置空”的意思。然而,我测试了json_decode()函数对于字符串'{"{a}":"{b,c,d}"}'的解析,结果符合预期。 - user554546
@Jack 使用弯引号,而不是花括号。 - Matt Ball
嗯...“curly quote”是什么? - user554546
@Jack Maney:MS Word智能引号 - JeremyP
3个回答

5

我从未遇到过这个具体的问题(即与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_encode有一个讨厌的习惯,即在发现无效字符(即非UTF8字符)时默默地丢弃它们。(有关背景,请参见此处:如何防止json_encode()丢弃具有无效字符的字符串
我猜测花括号引号可能在错误的字符集中,或者在途中被转换了。例如,可能是您的数据库连接被编码为ISO-8859-1。
请问您能否澄清数据来自何处以及以什么格式?

1

如果我需要这样做,我会先将文本复制到记事本中,然后再从那里复制。记事本会强制使用普通引号。虽然我从来没有通过代码这样做过...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接