Проблема следующая. Есть подрядчик, который шлет на наш сервер к скрипту json запрос. Пример запроса следующий:
{"internal_id":"2", "name" :"Партнер", "logo" :"тестовые данные"}
Шлет его подрядчик через какую то прикладную программу на windows 7, Уверяет что json запрос в utf-8. Во время пересылки вручную прописывает все хедеры с utf-8
Я принимаю запрос с помощью php
Вот скрипт:
include $_SERVER['DOCUMENT_ROOT']."/api/config.php";
header('Content-type: text/html; charset=utf-8');
$data = file_get_contents('php://input');
$result = mysql_query("INSERT INTO test3 (id, rek) VALUES ('', '$data')");
В результате, в бд я получаю
{"internal_id":"2", "name" :"???????", "logo" :"????????"}
То есть, кирилица в бд не записывается. В моей БД таблица типа MyISAM, поле rek имеет кодировку utf8_general_ci
Вот что я пробовал:
В результате этого теста я понимаю что его запрос приходит в windows-1251 на наш сервер, и игнорирует все его хедеры видимо и не кодируется на его стороне в утф8.
Я пробую с помощью php перекодировать вручную и сохранить:
$data = file_get_contents('php://input');
$test1 = mb_convert_encoding($data, "utf-8", "cp1251");
$text2 = iconv('cp1251', 'UTF-8', $data);
$result = mysql_query("INSERT INTO test3 (id, rek) VALUES ('', 'test1')");
В результате у меня даже с принудительной перекодировкой на моей стороне кирилица в БД не отображается, а показывается либо ???? либо другие кряки. Я пробовал две выше представленные функции, результата положительно нет.
Затем я попробвал в бд создать таблицу test3 но уже с cp1251_general_ci
Результат положительный. Все в бд сохраняется корректно.
Вопрос, как мне все таки перекодировать json, что еще можно попробовать, так как мне надо БД сохранить в utf8 что бы не иметь потом проблем.
Попробуйте использовать mb_detect_encoding для выяснения в какой кодировке приходят данные.
$convert_data = mb_convert_encoding($json, 'utf8', mb_detect_encoding($json));
И как я понимаю у Вас соединение с БД осуществляется через устаревший драйвер mysql. Установливается ли при коннекте к БД кодировка соединения?
mysql_query("SET NAMES utf8", $link);
Я так понял, вы кодируете json на стороне клиента. А ві попробуйте раскодировать и снова закодировать. PHP кодирует UTF-8 символы и вы получите что-то типа {"internal_id":"2","name":"\u041f\u0430\u0440\u0442\u043d\u0435\u0440","logo":"\u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435"}
include $_SERVER['DOCUMENT_ROOT']."/api/config.php";
header('Content-type: text/html; charset=utf-8');
$data = file_get_contents('php://input');
$data = json_encode(json_decode($json));
$result = mysql_query("INSERT INTO test3 (id, rek) VALUES ('', '$data')");
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости