Специальные символы в PHP / MySQL
-
10-07-2019 - |
Вопрос
У меня есть в базе данных слова, которые содержат специальные символы (в основном на испанском, например, тильды).В базе данных все сохраняется и отображается корректно с помощью phpMyAdmin, но когда я получаю данные (используя PHP) и отображаю их в браузере, я получаю странный символ, похожий на "?" с квадратом...Мне нужно общее исправление, чтобы мне не нужно было каждый раз экранировать каждый символ, а также я мог бы вставлять специальные испанские символы из PHP-формы в базу данных...
HTML-код правильный:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Все таблицы и базы данных имеют значение utf8_spanish
Персонаж, которого я получаю:�
Есть какие-нибудь предложения???
Спасибо!!!
Решение 4
Изменил кодировку HTML на ISO-8859-1 исправил проблему!Глупый
Другие советы
Я просто хотел бы предоставить более подробную информацию о решении, предложенном вартек что является (в зависимости от вашей установки MySQL) наиболее правильным решением вашей проблемы.Прежде всего, проблема с набором символов / кодировкой в MySQL - это несколько сложная тема, которая подробно освещена в руководстве по MySQL Глава 9.1 "Поддержка набора символов".В вашем случае особенно 9.1.4."Наборы символов соединения и параметры сортировки" будет наиболее актуально.
Чтобы сделать это короче:MySQL должен знать, какой набор символов / кодировку ожидает ваше клиентское приложение (говоря от имени базы данных, то есть вашего PHP-скрипта), поскольку оно перекодирует все строковые данные из внутреннего набора символов / кодировки, определенной на уровне сервера, базы данных, таблицы или столбца, в набор символов / кодировку соединения.Вы используете UTF-8 на стороне клиента, поэтому должны сообщить MySQL, что вы используете UTF-8.Это делается командой MySQL SET NAMES 'utf8'
который должен быть отправлен в качестве первого запроса при открытии соединения.В зависимости от вашей установки и клиентской библиотеки MySQL, которую вы используете в PHP-скрипте, это может выполняться автоматически при каждом подключении.
Если вы используете PDO, это просто вопрос настройки параметра конфигурации
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
Использование mysqli для изменения клиентского набора символов / кодировки еще проще:
$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");
Я надеюсь, что это поможет сделать все это более понятным.
Проблема SET NAMES 'utf8'
сразу после подключения:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
Попросите MySQL перевести это автоматически
$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);
http://es.php.net/manual/en/function.mysql-set-charset.php
Редактировать:из вашего комментария я заключаю, что на самом деле это закодировано в latin1, так что
mysql_set_charset('latin1_spanish_ci',$conn);
Я где-то нашел это и с тех пор использую целиком, не слишком задумываясь.
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
святое дерьмо..это сводило меня с ума.я пытался сделать то же самое.я добавил HTML-заголовок в кодировке utf-8..mysqli_set_charset() спасла меня несколько часов спустя, но я рад, что сейчас она работает
еще одна функция, которую можно попробовать для кодирования специальных символов и акцентов, - htmlentities()
Вы можете просто сделать:
$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
Включите кодировку unicode в вашем HTML.
Когда я имею дело со специальными символами, я всегда забочусь о следующем:
- Наборы символов базы данных, таблицы и полей имеют значение utf8_general_* или utf8_unicode_*
- Я слежу за тем, чтобы мой редактор сохранял PHP-файлы с правильным набором символов
- Я установил default_charset в php.ini в UTF-8 или
- Я отправляю Контент-тип:текст/html;кодировка= заголовок UTF-8
- Кодировка в МЕТА-теге - UTF-8 (она переопределяется HTTP-заголовком Content-Type).
- При подключении к MySQL я выдаю следующие запросы:
- УСТАНОВИТЕ ИМЕНА utf8
- УСТАНОВИТЬ НАБОР СИМВОЛОВ utf8
- УСТАНОВИТЕ COLLATION_CONNECTION="utf8_general_ci"/"utf8_general_ci"
Вы уверены, что у вас есть данные UTF8 в вашей базе данных для начала?
Ответ, который сработал для меня, - это тот, который опубликовал Стефан Гериг:
$mysqli->set_charset("utf8");
Мне просто нужно было добавить эту строку после определения соединения, и мои проблемы были решены!:)
(Я публикую ответ, так как не могу комментировать ...).
мое решение таково :сделайте все, что предложено выше но также я работаю с notepad ++, и файл должен быть сохранен вот так: перейдите в раздел кодирование на вкладке manu и сохраните файл -> закодировать в utf8
Интересно, что этот код у меня не сработал:
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1
Однако установка кодировки внутри условия работает:
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows utf8
}
Моя установка:
$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64