2015-03-09 4 views
0

Я использую 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, с которым я работаю.

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); 

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 месяца назад, и до сих пор ничего не было сделано, поэтому я не ожидаю, что это будет в ближайшее время.

+1

Возможно, вам стоит рассмотреть возможность обновления вашей установки PHP. Текущая версия - 5.6.6. Версия 5.2.9 является, по меньшей мере, архаичной. –

+0

Право, я бы с удовольствием, но в прошлый раз мы пробовали это, но у нас было немного фиаско. Внезапно ни один из наших скриптов не смог получить доступ к базе данных из-за того, что были сделаны новые пароли. Если нет другого пути, я думаю, мы сможем снова попытаться решить эту проблему. В прошлый раз, когда я проверял, наш провайдер только обновил бы нас до 5.4, хотя, Так что, если толчок наступит, я, вероятно, вернусь спросить, как сделать переход. – Bpainter

+0

Попробуйте использовать 'urlencode()' для кодирования специальных символов: © является '% C2% A9' в UTF-8. И подумайте (если ваш объект JSON передается в ваш PHP-файл через поле ''), используя атрибут 'value = ''' с одинарными кавычками. Свойства объектов JSON должны быть указаны в двойном порядке, и это может выглядеть странно для HTML marckup (например, '' 'значение будет только '{') –

ответ

0

Этот код работает для меня с использованием PHP 5.6.6 на Windows. Для сохранения © я использую urlencode перед json_encode, а затем я использую urldecode после использования json_decode, чтобы вернуть его.

<?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))); 

Edit: обновление для решения Последний комментарий На этот раз на Ubuntu (PHP 5.5.9-1ubuntu4.6 (кли) (постройки: 13 февраля 2015 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 
) 
+0

Это не то, что я ищу. Он практически ничего не делает. Результат такой же, как и вход, поэтому я не получаю нигде. Мне нужен объект JSON, чтобы я мог использовать цикл foreach для извлечения каждой части и обработки их. Это просто оставляет меня с длинной струной снова и обратно туда, где я начал. Кодирование JSON здесь бесполезно, так как я уже начинаю с действительного JSON, мне просто нужно преобразовать строку JSON в объект JSON. – Bpainter

+0

Извините, ваш вопрос был недостаточно ясным. Я думал, что вам трудно сохранить символ авторского права. 'JSON.parse()' и 'JSON.stringify()' конвертировать между объектом и строкой. – mkaatman

+0

Вы говорите в PHP? Они только метод JSON parsing, который я нашел в PHP, - это функции json_encode/json_decode. Я уже использую JSON.stringify() в коде AJAX, прежде чем я сохраню JSON в файл, но я не знал о JSON.parse(). Я могу попробовать что-то с этим и посмотреть, смогу ли я заставить его работать. Я очень ценю быстрые ответы. – Bpainter

1

Тьфу, 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, вам нужен PHP 5.3.0 или выше для ENT_IGNORE, и вам нужен PHP 5.4.0 для ENT_SUBSTITUTE и без, по крайней мере, ENT_IGNORE: «Если вход строка содержит недопустимую последовательность блоков кода в данной кодировке, будет возвращена пустая строка, если не установлены флаги 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)

Смежные вопросы