Я выбираю некоторые данные из базы данных и кодирую их как json, но у меня проблема с чешскими знаками, такими как
A, I, R, C, Z …
Мой файл находится в кодировке utf-8, моя база данных также находится в кодировке utf-8, я также установил заголовок для кодировки utf-8. Что еще мне делать, пожалуйста?
Мой код:
header('Content-Type: text/html; charset=utf-8'); while($tmprow = mysqli_fetch_array($result)) { $row['user'] = mb_convert_encoding($tmprow['user'], "UTF-8", "auto"); $row['package'] = mb_convert_encoding($tmprow['package'], "UTF-8", "auto"); $row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto"); $row['rating'] = mb_convert_encoding($tmprow['rating'], "UTF-8", "auto"); array_push($response, $row); } $json = json_encode($response, JSON_UNESCAPED_UNICODE); if(!$json) { echo "error"; }
и часть напечатанного json: "package":"zv???tkanalouce"
EDIT: без функции mb_convert_encoding () печатная строка пуста и печатается «ошибка».
С кодом, который у вас есть в вашем примере, вывод:
json_encode($response, JSON_UNESCAPED_UNICODE); "package":"zv???tkanalouce"
Вы видите вопросительные знаки там, потому что они были введены mb_convert_encoding
. Это происходит, когда вы используете обнаружение кодировки (« auto
» в качестве третьего параметра) и что обнаружение кодировки не способно обрабатывать символ на входе, заменяя его вопросительным знаком. Примерная строка кода:
$row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto");
Это также означает, что данные, выходящие из вашей базы данных, не кодируются UTF-8, потому что mb_convert_encoding($buffer, 'UTF-8', 'auto');
не вводит вопросительные знаки, если $buffer
кодируется UTF-8.
Поэтому вам нужно выяснить, какая кодировка используется в вашем подключении к базе данных, потому что драйвер базы данных преобразует строки в кодировку соединения.
Самое простое, что вы просто укажете на ссылку базы данных, которую вы запрашиваете для строк UTF-8, а затем просто используйте их:
$mysqli = new mysqli("localhost", "my_user", "my_password", "test"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } /* change character set to utf8 */ if (!$mysqli->set_charset("utf8")) { printf("Error loading character set utf8: %s\n", $mysqli->error); } else { printf("Current character set: %s\n", $mysqli->character_set_name()); }
В предыдущем примере кода просто показано, как установить набор символов клиента по умолчанию для UTF-8 с помощью mysqli. Из этого руководства было взято , как и материал, который мы имеем на сайте, например utf 8 – PHP и MySQLi UTF8 .
Затем вы можете значительно улучшить свой код:
$response = $result->fetch_all(MYSQLI_ASSOC); $json = json_encode($response, JSON_UNESCAPED_UNICODE); if (FALSE === $json) { throw new LogicException( sprintf('Not json: %d - %s', json_last_error(), json_last_error_msg()) ); } header('Content-Type: application/json'); echo $json;