php json_encode(): «Искаженные символы UTF-8», несмотря на отсутствие необычных символов

#php

#php

Вопрос:

У меня есть скрипт, который создает массив, содержащий записи для таблицы, которую я хотел бы закодировать как json для отправки в мое приложение. Каждая запись представляет собой ассоциативный массив из k / v пар string=>string|int . Код для генерации полного массива выглядит следующим образом:

 $entries = [];
foreach($stats as $i => $stat){
    $playerStats = new Player_Stats($stat);
    $entry = [
        'place' => $i,
        'name' => $playerStats->name(),
        'elo' => $playerStats->currentRating(),
        'highest' => $playerStats->highRating(),
        'masterPoints' => $playerStats->onlineMasterPoints(),
        'winLose' => $playerStats->matchesWonLost(),
        'winRate' => $playerStats->winPercent(),
        'numEvents' => $playerStats->numEvents(),
        'wins' => $playerStats->eventsWon(),
        'placed' => $playerStats->eventsPlaced()
    ];
    $entries[] = $entry;
}
$result = json_encode($entries);
  

Когда я выполняю подсчет или vardump и т. Д. Для записей, Это ясно показывает, что они были правильно заполнены правильными данными. json_encode() однако возвращает false . Используя json_last_error_msg() , я получаю ошибку UTF-8 в названии : Malformed UTF-8 characters, possibly incorrectly encoded . Во всех других сообщениях по этому вопросу я мог найти задействованные символы из других языков. Все содержимое в этом массиве состоит из английского алфавита и цифр, все символы ascii, не говоря уже о utf-8.

Я просто упускаю что-то тривиальное (обычно я) или я должен искать или пробовать что-то совсем другое?

Комментарии:

1. можете ли вы предоставить нам полезную нагрузку, для которой вы получаете ошибку?

Ответ №1:

Вы можете использовать опцию, чтобы игнорировать их, JSON_INVALID_UTF8_IGNORE поэтому ваш код будет json_encode($data, JSON_INVALID_UTF8_IGNORE);

Это будет игнорировать недопустимый UTF-8, как описано в названии. Вы можете увидеть все варианты json_encode здесь. https://www.php.net/manual/en/function.json-encode.php

Комментарии:

1. Обычно я бы согласился, но в данном контексте я бы обсудил, что ошибка заключается в кодировке символов, вы можете использовать опцию игнорировать в json_encode, пока не найдете корень вашей проблемы.

2. Это предотвратило возникновение ошибок, но не устранило основную проблему. Я пошел и отследил единственное возникновение проблемы, и оказалось, что в данных есть пара нечетных символов, но все они являются символами Unicode, в данном конкретном случае это ñ

Ответ №2:

Что-то вроде этого может помочь:

 $result = json_encode(array_map(utf8_encode, $entries))