UTF-8 кодированные html-страницы отображают (вопросительные знаки) вместо символов
У меня есть стандартная установка XAMPP на win7 (x64).
Имея мою долю проблем с кодированием в прошлом проекте, где кодировка mysql не соответствовала запросу php, который в свою очередь иногда выводил html в других кодировках, я решил последовательно кодировать все, используя utf-8.
Я только начинаю с разметки html и все уже испытываю проблемы.
- Моя страница сохраняется с помощью utf-8 (без спецификации, я думаю)
//update: Оказывается, это не так. Файл был фактически сохранен с помощью ISO_8859-1
. Позже я узнал об этом благодаря ответу Шерма Пендлиса. Мне пришлось вернуться и изменить настройки проекта (которые были установлены на "ISO-8859-1" ) на желаемый "UTF-8".
- php установлен на .htaccess для обслуживания .php-страниц в utf-8 с помощью:
AddCharset UTF-8 .php
- html имеет метатег, указывающий:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- Чтобы проверить, я установил используемый php
header('Content-Type:text/html; charset=UTF-8');
Очевидно, что страница используется в utf-8 (firefox и chrome распознают ее как таковой), но любые специальные символы, такие как é
, á
или ¡
, будут отображаться только как �
. Также при просмотре исходного кода.
При удалении упомянутых выше настроек кодирования все символы отображаются правильно, но обнаруженная кодировка показывает, что в зависимости от браузера отображается windows-1252
или ISO-8859-1
.
Как получилось? Я очень озадачен. Я бы ожидал совершенно противоположного поведения.
Любые советы приветствуются, спасибо!
изменить:
Надеюсь, это поможет немного больше. Это заголовок ответа (в соответствии с firebug)
HTTP/1.1 200 OK
Date: Sat, 26 Mar 2011 20:49:44 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 91
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
Ответы
Ответ 1
Когда [удаление] настроек кодировки упомянутые выше все символы [отображаются] правильно, но обнаруженная кодировка показывает либо windows-1252, либо ISO-8859-1 в зависимости от браузера.
Тогда это то, что вы действительно отправляете. Ни один из параметров кодирования в вашем списке маркеров фактически не изменит ваш вывод каким-либо образом; все, что они делают, сообщает браузеру, какую кодировку следует принимать при интерпретации отправляемого вами. Вот почему вы получаете эти s - вы сообщаете браузеру, что то, что вы отправляете, это UTF-8, но это действительно ISO-8859-1.
Ответ 2
В моем случае база данных вернула latin1
, когда мой браузер ожидал utf8
.
Итак, для MySQLi я сделал:
mysqli_set_charset($dblink, "utf8");
Подробнее о http://php.net/manual/en/mysqli.set-charset.php
Ответ 3
Проверьте, что какой-либо из ваших файлов .php
, которые печатают некоторый текст, также правильно кодируется в utf-8
.
Ответ 4
Сначала сообщите PDO о своем charset
.... что-то вроде
PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password);
Обратите внимание на часть charset=utf8;
.
надеюсь, что это поможет!
Ответ 5
Похоже, никто не упомянул
SET NAMES utf8;
Я нашел это решение здесь, и это помогло мне. Как его применить:
Чтобы быть всем UTF-8, выполните следующую инструкцию сразу после того, как вы установили соединение с сервером базы данных: SET NAMES utf8;
Возможно, это поможет кому-то.
Ответ 6
Я из Бразилии и создаю свои базы данных с помощью latin1_spanish_ci
. Для html и всего остального я использую:
charset=ISO-8859-1
Данные идут правильно с помощью é
, ã
и ç
... Иногда мне нужно поместить тексты html с помощью его кода, например:
Olá
дает мне
Olá
Коды можно найти на этой странице: http://www.ascii.cl/htmlcodes.htm
Надеюсь, это поможет. Я помню, это было ДЕЙСТВИТЕЛЬНО раздражает.
Ответ 7
Проблема заключается в кодировке, которая используется apache для обслуживания страниц. Я работаю с Linux, поэтому ничего не знаю о XAMPP. У меня была та же проблема, что я сделал для решения проблемы, заключался в том, чтобы добавить charset в конфигурационный файл charset
(по умолчанию комментируется).
В моем случае у меня есть это в /etc/apache2/conf.d/charset
, но, поскольку вы используете Windows, расположение отличается. Поэтому я даю вам это как идею о том, как его решить.
В конце мой конфигурационный файл charset выглядит так:
# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.
AddDefaultCharset UTF-8
Надеюсь, это поможет.