Php json_encode частично не работает с массивами

У меня есть PHP-код, который должен кодировать данные таблицы DB в json. Поэтому я использовал json_encode().

Я использую приведенные здесь таблицы - http://www.geekality.net/2011/08/21/country-names-continent-names-and-iso-3166-codes-for-mysql/

Поведение этого кода, по-видимому, отличается для разных входов.

Запрос - $query = "SELECT * FROM countries "; не возвращает никаких значений json.

Запрос - $query = "SELECT * FROM countries where continent_code='AS'"; корректно возвращает значения json.

тогда как $query = "SELECT * FROM countries where continent_code='EU'"; также ничего не возвращает.

Сходство "NA", "AF" не срабатывало, а другие работали идеально.

Я странно это поведение PHP json_encode.

Это мой код.

<?php
$con=mysqli_connect('localhost','xxxx','xxxxx','joomla30');
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result = mysqli_query($con,"SELECT * FROM countries where continent_code='EU'") or die (mysqli_error($con));

while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
      $orders[] = array(
          'CountryCode' => $row['code'],
          'CountryName' => $row['name']
          );
  }
//print_r($orders);

echo json_encode($orders);

mysqli_close($con);
?>

До предыдущей строки json_encode данные переносятся. Поэтому я думаю, что проблема с json-кодированием.

Я пытался узнать об этом, используя print_r($orders);.
Я получил от него следующий результат.

Если я попытаюсь использовать "ЕС", я получаю этот массив.

Array ( [0] => Array ( [CountryCode] => AD [CountryName] => Andorra ) 
[1] => Array ( [CountryCode] => AL [CountryName] => Albania ) 
[2] => Array ( [CountryCode] => AT [CountryName] => Austria ) 
[3] => Array ( [CountryCode] => AX [CountryName] => Åland Islands )...

Если я пытаюсь использовать "AS", я получаю этот массив.

Array ( [0] => Array ( [CountryCode] => AE [CountryName] => United Arab Emirates ) 
[1] => Array ( [CountryCode] => AF [CountryName] => Afghanistan) 
[2] => Array ( [CountryCode] => AM [CountryName] => Armenia) 
[3] => Array ( [CountryCode] => AZ [CountryName] => Azerbaijan)...

Оба массива выглядят одинаково правильно... Но Json_encode работает только на "AS", а не на "EU".

Кто-нибудь знает, как решить эту проблему? Если да, скажите мне, пожалуйста.

Ответ 1

Вы должны убедиться, что каждый компонент вашего веб-приложения использует UTF-8. Этот ответ из другого вопроса расскажет вам, как это сделать. Если вы читаете это из RFC4627:

Кодирование: текст JSON ДОЛЖЕН быть закодирован в Юникоде. Кодировка по умолчанию - UTF-8.

Функция json_encode требует, чтобы все входящие данные кодировались в кодировке UTF-8. Поэтому строки, такие как Åland Islands, вероятно, вызывают проблемы.

Ответ 2

Просто случайное предположение: json_encode требует, чтобы все данные, которые вы кормили, кодировались в кодировке UTF-8, и в противном случае это не удастся. В тех странах, где он терпит неудачу, у вас, вероятно, есть данные, которые содержат символы, отличные от ASCII. Чистый ASCII, оказывается, совместим с символами UTF-8, отличными от ASCII, которые вам необходимо соблюдать. См. UTF-8 на протяжении всего пути о том, как получить кодированные данные UTF-8 из вашей базы данных (используйте mysqli_set_charset).