PHP:版权符号上的json_decode

时间:2015-03-09 18:58:38

标签: php json

我在Windows机器上使用PHP 5.2.9-2和WAMP。

我在尝试解码其中一个元素中包含版权符号的JSON字符串时遇到问题。该函数始终返回NULL。我的第一个想法是试图逃避角色,但htmlentities()函数只返回相同的字符串。我试图像这样传递参数:

htmlentities($json, ENT_NOQUOTES, 'utf-8'); 

但是只返回一个空字符串。我考虑过尝试使用ENT_IGNORE,但它仅适用于PHP 5.3.0+。如果JSON对象中包含此版权符号,如何将此JSON字符串正确编码到其中?

我无法控制JSON的来源,是的,格式正确。我从第三方API获取信息,该字符串的文件大小略大于20MB。我使用ajax获取JSON然后将其保存到文件中,然后将其读入PHP。

编辑:以下是我正在使用的JSON的链接。

DROPBOX LINK

具体的一行是

...{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}...

EDIT2:

为了澄清,我希望将此JSON字符串转换为JSON对象,以便我可以使用foreach循环来提取每个部分并对其进行处理。如果我最后得到一个字符串,我就不会在哪里。我一直在使用像这样的解码函数来获取关联数组:

json_decode($json, true);

编辑3: 我已经整理了问题的准系统版本。我所做的就是从txt文件中读取JSON并尝试通过json_decode()函数运行它。使用版权符号,它失败了。没有它,它工作正常。这是:

***Contents of SOExampleJSON.txt***
{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}

***PHP Code***
<?php
    echo '<pre>';
    $rawJson = file_get_contents('SOExampleJSON.txt');
    var_dump($rawJson);

    $json = json_decode($rawJson);
    var_dump($json);
    echo '</pre>';
?>

***Output***
string(120) "{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}"
NULL

***Output when copyright is removed***
string(119) "{"Ranking":1115,"Name":"lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}"
object(stdClass)#1 (8) {
  ["Ranking"]=>
  int(1115)
  ["Name"]=>
  string(9) "lutchGod-"
  ["Rank"]=>
  int(55)
  ["TotalExp"]=>
  int(8571865)
  ["KDR"]=>
  float(1.14)
  ["Kill"]=>
  int(66459)
  ["HeadShot"]=>
  int(11785)
  ["clan"]=>
  string(4) " pG "
}

我需要上面的对象,但我需要保留“名称”,以便我可以在以后比较它。我不关心它是什么格式,只要它可用。据我所知,这是唯一带有这种符号的名称。该符号甚至不被允许作为名称的一部分,但开发人员显然已经在他们的检查中的某个地方搞砸了,现在我必须找到解决方法,直到他们修复它。我在2个月前报告了它,但仍然没有做任何事情,所以我不认为它会很快。

2 个答案:

答案 0 :(得分:1)

yuck,PHP 5.2.X ...... 我认为这个黑客应该工作

<?php 
$json=base64_decode('eyJSYW5raW5nIjoxMTE1LCJOYW1lIjoiwqlsdXRjaEdvZC0iLCJSYW5rIjo1NSwiVG90YWxFeHAiOjg1NzE4NjUsIktEUiI6MS4xNCwiS2lsbCI6NjY0NTksIkhlYWRTaG90IjoxMTc4NSwiY2xhbiI6IiBwRyAifQ==');
assert(strlen($json)>1);
$parsedJson=json_decode($json,true);
assert($parsedJson!=null);
?>
<script type="text/javascript">
var str=atob("<?php echo base64_encode(var_export($parsedJson,true));?>");
alert(str);
</script>

但是,当你升级到5.4.0或更高版本时,这将是一个更好的方法

<?php 
$json=base64_decode('eyJSYW5raW5nIjoxMTE1LCJOYW1lIjoiwqlsdXRjaEdvZC0iLCJSYW5rIjo1NSwiVG90YWxFeHAiOjg1NzE4NjUsIktEUiI6MS4xNCwiS2lsbCI6NjY0NTksIkhlYWRTaG90IjoxMTc4NSwiY2xhbiI6IiBwRyAifQ==');
assert(strlen($json)>1);
$parsedJson=json_decode($json,true,1337);
assert($parsedJson!=null);
echo '<pre>';
ob_start();
var_dump($parsedJson);
echo htmlentities(ob_get_clean(),ENT_SUBSTITUTE);
echo '</pre>';

另外,你的问题可能不是json解码,它的html编码,ENT_IGNORE你需要PHP 5.3.0或更高版本,你需要PHP 5.4.0 for ENT_SUBSTITUTE,并且至少没有ENT_IGNORE:“如果输入string包含给定编码中的无效代码单元序列,除非设置了ENT_IGNORE或ENT_SUBSTITUTE标志,否则将返回空字符串。“ (http://php.net/manual/en/function.htmlentities.php)..我猜@计数。但使用断言只是为了确保这一点。也使用error_reporting(E_ALL); ,最好是exception_error_handler(见http://php.net/manual/en/class.errorexception.php

答案 1 :(得分:0)

此代码适用于在Windows上使用PHP 5.6.6。保留©我在json_encode之前使用urlencode然后在使用json_decode之后使用urldecode将其恢复。

<?php
$test = urlencode('{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}');

$test2= json_encode($test);
var_dump(urldecode(json_decode($test2)));

编辑:更新以解决最新评论 这次是在Ubuntu上(PHP 5.5.9-1ubuntu4.6(cli)(内置:2015年2月13日19:17:11))

header('Content-Type: text/html; charset=utf-8');
$test = '{"Ranking":1115,"Name":"©lutchGod-","Rank":55,"TotalExp":8571865,"KDR":1.14,"Kill":66459,"HeadShot":11785,"clan":" pG "}';
$test2 = json_decode($test);
print_r($test2);

输出:

stdClass Object
(
    [Ranking] => 1115
    [Name] => ©lutchGod-
    [Rank] => 55
    [TotalExp] => 8571865
    [KDR] => 1.14
    [Kill] => 66459
    [HeadShot] => 11785
    [clan] =>  pG 
)