У меня возникла проблема, которая, как мне кажется, связана с текстом unicode. Когда пользователь вводит строку с символом маркера unicode, mysql не может сохранить это поле (остальная часть запроса на обновление работает, хотя). Вот как я пытался справиться с этим.
$str = "· Close up the server";
$str = preg_replace("\u2022", "•", $str);
… однако это все еще не работает.
Так много вещей может пойти не так, потому что база данных, формы и исходные тексты строк. Предположим, вы хотите использовать UTF-8, потому что с любым другим типичным кодированием (CP1252, Latin1) вы будете ввернуты, если хотите использовать json_
или принять более 200 разных символов.
Первое, что нужно сделать – удалить любой код конверсии и т. Д., Который был написан с целью исправить проблемы с кодировкой. Например, utf8_encode
, htmlentitites
, *_replace
.. что угодно.
Исходная кодировка.
$str = "· Close up the server";
При написании выше, исходный файл PHP должен быть физически закодирован в UTF-8. Если вы находитесь в Windows, вы должны явно это сделать или настроить. UTF-8 волшебным образом не работает в Windows.
Форма отправляет
Когда пользователь отправляет форму, полезная нагрузка будет в любой кодировке, которую вы указали на странице. Вы можете объявить его так:
header("Content-Type: text/html; charset=utf-8");
Но любой может фактически отправить произвольные байты на ваш сервер, поэтому вы должны проверить, что вход находится в UTF-8, прежде чем продолжить. mb_check_encoding
– это хорошо.
База данных
Поскольку на данный момент ваши данные поступают как UTF-8, ваши входные строки находятся в UTF-8. Вы должны указать это после подключения к базе данных, указав кодировку соединения.
mysql_set_charset("utf8"); //After making the connection, and before any queries //or $mysqli->set_charset( "utf8");
Это заставляет базу данных читать ваши данные в UTF-8 и кодировать ее вывод в UTF-8. Вы также хотели бы установить свои столбцы / таблицы / базы данных в UTF-8.
Unicode escape-последовательности \uxxxx
или \uhhhh\ullll
или \Uxxxxxxxx
не поддерживаются в PHP.
\u2022
– это шестнадцатеричное кодирование UTF-16
для «Bullet». Не UTF-8
.
Возможно, вы также захотите SET NAMES 'UTF-8';
или изменить кодировку, прежде чем открывать базу данных.