PDO-запрос возвращает много кодов символов \ uXXXX, которые я не могу преобразовать в символы Unicode

У меня есть таблица базы данных MySQL, в которой хранятся имена стран на разных языках, и я не могу получить данные для отображения в символах Unicode – я могу получить только коды \ uXXXX, где должны быть специальные символы.

Запрос используется в запросе AJAX с результатами, закодированными как объект JSON.

Вот таблица (усеченная):

CREATE TABLE IF NOT EXISTS `tbl_countries` ( `ccode` varchar(2) character set utf8 collate utf8_unicode_ci NOT NULL default '', `country_en` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL default '', `country_fr` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `country_de` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `country_es` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `country_ru` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `country_tr` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, `country_ar` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL, PRIMARY KEY (`ccode`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- Dumping data for table `tbl_countries` -- INSERT INTO `tbl_countries` (`ccode`, `country_en`, `country_fr`, `country_de`, `country_es`, `country_ru`, `country_tr`, `country_ar`) VALUES ('AF', 'Afghanistan', 'Afghanistan', 'Afghanistan', 'Afganistán', 'Афганистан', 'Afganistan', 'أفغانستان'), ('AX', 'Aland Islands', 'Îles Åland', 'Alandinseln', 'Islas Åland', 'Аландские острова', 'Aland Adaları', 'جزر أولان'), ('AL', 'Albania', 'Albanie', 'Albanien', 'Albania', 'Албания', 'Arnavutluk', 'ألبانيا'), ('DZ', 'Algeria', 'Algérie', 'Algerien', 'Argelia', 'Алжир', 'Cezayir', 'الجزائر'), ('AS', 'American Samoa', 'Samoa américaines', 'Amerikanisch-Samoa', 'Samoa Americana', 'Американское Самоа', 'Amerikan Samoası', 'ساموا الأمريكية'); 

Это код для создания PDO:

 $conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") ); $return_arr = array (); if ($conn) { $ac_term = $_GET['term']; $query = "SELECT * FROM `tbl_countries` WHERE `country_en` LIKE :term"; $result = $conn->prepare ($query); $result->bindValue (":term", "%".$ac_term."%"); $result->execute (); /* Retrieve and store in array the results of the query.*/ while ($row = $result->fetch (PDO::FETCH_ASSOC)) { $row_array['country_en'] = $row['country_en']; $row_array['country_de'] = $row['country_de']; $row_array['country_es'] = $row['country_es']; $row_array['country_fr'] = $row['country_fr']; $row_array['country_ru'] = $row['country_ru']; $row_array['country_tr'] = $row['country_tr']; $row_array['country_ar'] = $row['country_ar']; $row_array['ccode'] = $row['ccode']; array_push ($return_arr, $row_array); } } unset ($conn); echo json_encode ($return_arr); 

В начале PHP-скрипта находится следующая строка:

 header('Content-Type: text/html; charset=utf-8'); 

Это типичный результат, который я получаю, если войти в поисковый united%20king :

 [{ "country_en":"United Kingdom", "country_de":"Vereinigtes K\u00f6nigreich", "country_es":"Reino Unido", "country_fr":"Royaume-Uni", "country_ru":"\u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u044f", "country_tr":"Birle\u015fik Krall\u0131k", "country_ar":"\u0627\u0644\u0645\u0645\u0644\u0643\u0629 \u0627\u0644\u0645\u062a\u062d\u062f\u0629", "ccode":"GB" }] 

В PHP-коде я пробовал использовать htmlentities , но он показывал только специальные символы для немецкого выхода:

 $row_array['country_de'] = htmlentities ($row['country_de'], ENT_QUOTES, "UTF-8"); 

Что мне не хватает? Спасибо за прочтение.

Это не PDO, а регулярное поведение json_encode. В современных версиях PHP вы можете отключить его, но это не должно быть проблемой в любом случае.

Я понятия не имею, почему вы хотите отменить исходный код json, но обычно он не предназначен для эха непосредственно в HTML, а используется некоторыми JS-кодами. И JS может сортировать эту кодировку. Однако, чтобы уменьшить объем данных, так JSON_UNESCAPED_UNICODE может использоваться 5,4 JSON_UNESCAPED_UNICODE флаг.

Также позвольте мне предложить вам немного отладить ваш код, прежде чем задавать вопрос.
Если вы хотите проверить вывод PDO, сделайте это для PDO, а не для json. Проверяйте каждый шаг вашей программы, чтобы найти тот, который портит данные.

Это совершенно верно JSON ; эти escape-последовательности являются обычным способом JSON для кодирования символов, отличных от ASCII. Если вы декодируете его на клиенте с помощью обычного JSON-декодера, вы получите правильные символы.