Я использую PHP 5.2.9-2 с WAMP на компьютере под управлением Windows.PHP: json_decode на символ авторского права
У меня возникла проблема с расшифровкой строки JSON, содержащей символ авторского права в одном из элементов. Функция всегда возвращает NULL. Моя первая мысль заключалась в попытке избежать символа, но функция htmlentities() просто возвращает ту же строку. Я попытался передать аргументы следующим образом:
htmlentities($json, ENT_NOQUOTES, 'utf-8');
Но это возвращает только пустую строку. Я думал о попытке ENT_IGNORE, но он доступен только в PHP 5.3.0+. Как я могу получить эту строку JSON правильно закодированной в объект JSON, когда в нем есть этот символ авторского права?
У меня нет контроля над источником JSON и да, он правильно отформатирован. Я получаю информацию от стороннего API, а строка имеет размер файла чуть более 20 МБ. Я использую ajax, чтобы получить JSON, а затем сохранить его в файл, а затем прочитать в PHP.
EDIT: Вот ссылка на JSON, с которым я работаю.
Специфическая линия это
...{"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);
EDIT 3: Я соединил баребоны версии проблемы. Все, что я делаю, читается в JSON из txt-файла и пытается запустить его через функцию 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 месяца назад, и до сих пор ничего не было сделано, поэтому я не ожидаю, что это будет в ближайшее время.
Возможно, вам стоит рассмотреть возможность обновления вашей установки PHP. Текущая версия - 5.6.6. Версия 5.2.9 является, по меньшей мере, архаичной. –
Право, я бы с удовольствием, но в прошлый раз мы пробовали это, но у нас было немного фиаско. Внезапно ни один из наших скриптов не смог получить доступ к базе данных из-за того, что были сделаны новые пароли. Если нет другого пути, я думаю, мы сможем снова попытаться решить эту проблему. В прошлый раз, когда я проверял, наш провайдер только обновил бы нас до 5.4, хотя, Так что, если толчок наступит, я, вероятно, вернусь спросить, как сделать переход. – Bpainter
Попробуйте использовать 'urlencode()' для кодирования специальных символов: © является '% C2% A9' в UTF-8. И подумайте (если ваш объект JSON передается в ваш PHP-файл через поле ''), используя атрибут 'value = ''' с одинарными кавычками. Свойства объектов JSON должны быть указаны в двойном порядке, и это может выглядеть странно для HTML marckup (например, '' 'значение будет только '{') –