Помогите перекодировать json в utf8

177
14 апреля 2019, 13:30

Проблема следующая. Есть подрядчик, который шлет на наш сервер к скрипту 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

Вот что я пробовал:

  1. Я попросил сгенерировать json файл с этой программы, и затем я попытался открыть у себя в саблайме. При открытии у меня редактор не распознает кирилицу, виджу кряки. Я вручную через саблайм пробовал переоткрыть файл и он открывается корректно в  windows-1251.

В результате этого теста я понимаю что его запрос приходит в 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 что бы не иметь потом проблем.

Answer 1

Попробуйте использовать mb_detect_encoding для выяснения в какой кодировке приходят данные.

$convert_data = mb_convert_encoding($json, 'utf8', mb_detect_encoding($json));

И как я понимаю у Вас соединение с БД осуществляется через устаревший драйвер mysql. Установливается ли при коннекте к БД кодировка соединения?

mysql_query("SET NAMES utf8", $link); 
Answer 2

Я так понял, вы кодируете 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')");
READ ALSO
Отправка пушей Firebase через форму PHP

Отправка пушей Firebase через форму PHP

Есть работающий код, но хотелось бы прикрутить форму заполнения для отправкиПробовал, пуши якобы уходят но в приложение не приходят

198
Поведение к зависимости от типа?

Поведение к зависимости от типа?

У меня имеется модель занятия, соответствующая миграция и запись в бдУ занятия имеется тип (отношение), определяется при создании модели...

205
Корректный вызов private функции

Корректный вызов private функции

Почему следующая программа выводит B, ведь функция bar вызывает private функцию?

203