Вопрос

У меня есть в базе данных слова, которые содержат специальные символы (в основном на испанском, например, тильды).В базе данных все сохраняется и отображается корректно с помощью 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top