У меня есть json-файл, подобный этому
{"downloads":[ { "url":"arquivo1.pdf", "descricao":"árquivo 1" }, { "url":"arquivo2.pdf", "descricao":"arquivo 2" } ]}
И я сохраняю его с помощью кодировки UTF-8 через Notepad ++ .
Затем я получаю содержимое файла:
function getContent($name) { $content = file_get_contents("configs/" . $name . ".json"); $encoded = utf8_encode($content); return json_decode($encoded); }
и json_decode
возвращает значение null
.
Если я сохраню файл json как ANSI, тогда он будет работать. Но я хотел бы сохранить его как UTF-8.
Я подозреваю, что исходный файл либо уже находится в UTF-8, либо в плохо отформатированном типе.
NULL возвращается, если json не может быть декодирован или если кодированные данные глубже, чем предел рекурсии.
Плохая кодировка
Вы можете проверить, является ли ваш входной контент уже действительным utf-8, выполнив следующие действия:
$is_valid_utf8 = mb_check_encoding($content, 'utf-8'));
Если это так, не перекодируйте его.
В документации есть что предложить: http://php.net/mb-check-encoding
BOM
Или, может быть, Notepad ++ задает спецификацию, которая может запутать json_decode
.
//Remove UTF-8 BOM if present, json_decode() does not like it. if(substr($content, 0, 3) == pack("CCC", 0xEF, 0xBB, 0xBF)) { $content = substr($content, 3); }
см. документацию json_decode
.
json_decode отлично работает с UTF-8 без спецификации. У вас есть какие-то особые причины для использования спецификации?
Если вы конвертируете свой json-файл в UTF-8 без спецификации, вам не нужно будет кодировать контент позже с помощью utf8_encode.
Он не работает, потому что ваш файл уже находится в UT8, и когда вы снова utf8_encode()
его с помощью utf8_encode()
, PHP предполагает, что ваша строка является строкой ISO-8859-1 и, следовательно, ее разрывает.