2013-04-22 3 views
3

У меня есть простой PHP-скрипт, который ищет базу данных mySQL и выводит результат пользователю. Раньше я использовал ISO-8859-1 в качестве моей кодировки, но мне было рекомендовано использовать UTF-8. Но у меня проблемы с моей прежней кодировкой на новую.UTF-8 дает мне вопросительные знаки

Чтобы прояснить некоторые вещи, у меня есть:

  • создание базы данных и таблиц, закодированные в UTF-8 при сличении utf8_unicode_ci.
  • Закодировал мой PHP-файл в UTF-8.
  • Установите мета-кодировку на UTF-8.
  • Весь текст mime-types до UTF-8 по create-mime.assign.pl в Lighty (Lighttpd).

Теперь проблема возникает, когда я извлечение данных из базы данных с символами, как ö, ü и т.д. Если я просто echo "ö"; без извлечения его из базы данных, он отлично работает. Я предполагаю, что, должно быть, что-то не так с базой данных?

Я попытался следующие, и они решили мою проблему:

  • Установите мета кодировок в ISO-8859-1 (который, по какой-то странной причине работает, но ломает echo'd «ö»).
  • Установите функцию utf8_decode() вокруг выхода.
  • После mysql_select_db() заявил следующее mysql_set_charset('utf8');.

Я знаю, что нашел несколько решений, но я просто не знаю, почему это не будет работать без них? И неуместно ли использовать utf8_decode() на выходе, или функцию mysql_set_charset()?

+0

разъем базы данных, а? .. ah, nope ... да, вам нужно установить кодировку на соединителе ('mysql_set_charset' - хотя это устарело, и вы должны хотя бы использовать MySQLi), иначе вы захотите преобразовать utf-8 в базе данных до iso 8859-1 (по умолчанию для соединителя MySQL), прежде чем передавать его на PHP и, в конечном счете, на экран ..., который затем приведет к '?' – CD001

+0

@ CD001 Почему, черт возьми, стандартный соединитель MySQL по умолчанию соответствует ISO-8859-1? Ну что ж, предположим, это проблема. Попробуем использовать приведенный ниже ответ. – AnonymousJ

+0

Хехех - да, я знаю ... попробуйте http://php.net/manual/en/mysqli.set-charset.php или http://uk3.php.net/manual/en/function.mysql-set -charset.php, хотя теперь все функции 'mysql_ *' устарели. – CD001

ответ

1

MySQL забавен с UTF8. Вы должны убедиться, что сервер работает в UTF и что соединение, а

Если вы можете изменить файл my.cnf на сервере вы можете добавить их в раздел [туздЫ] и перезапустить его

character-set-server = utf8 
skip-character-set-client-handshake 

Вы можете в качестве альтернативы (или а) использовать

query("SET NAMES utf8"); 

перед отправкой/извлечения данных для обеспечения базы данных ожидает данные UTF8 быть переданы

+0

Попробует посмотреть, будет ли он работать, если я отредактирую файл my.cnf. Кстати, решение SET NAMES не рекомендуется (или это то, что я читал в нескольких сообщениях stackoverflow)] (http://stackoverflow.com/questions/5288953/is-mysql-real-escape-string-broken/5289141 # 5289141). – AnonymousJ

+0

Существуют лучшие способы достижения кодировки, которая устанавливает имена, но если все остальное не удается (или вы ограничены вашим хостинг-провайдером), это возможное решение. Вот почему я включил его. Моей рекомендацией было бы изменить файл my.cnf, чтобы правильно настроить соединение. – fullybaked

+0

Но хватит ли 'character-set-server = utf8' и' skip-character-set-client-handshake'? Должен ли я также выполнять 'default-character-set = utf8' как в [mysqld], так и в [client] и' character-set-client = utf8' в [mysqld]? – AnonymousJ

Смежные вопросы