HTML-страницы в кодировке UTF-8 показывают символы (знаки вопроса) вместо символов - PullRequest
31 голосов
/ 26 марта 2011

У меня есть стандартная установка 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

Ответы [ 7 ]

22 голосов
/ 27 марта 2011

При [отбрасывании] упомянутых выше настроек кодировки все символы [отображаются правильно], но обнаруженная кодировка показывает либо windows-1252, либо ISO-8859-1 в зависимости от браузера.

Тогда это то, что вы действительно отправляете.Ни один из параметров кодировки в вашем списке маркеров фактически не изменит ваш вывод;все, что они делают, это сообщают браузеру, какую кодировку использовать при интерпретации того, что вы отправляете.Вот почему вы получаете эти сообщения - вы говорите браузеру, что отправляете UTF-8, но на самом деле это ISO-8859-1.

13 голосов
/ 05 августа 2016

В моем случае база данных возвратила latin1, когда мой браузер ожидал utf8.

Так что для MySQLi я сделал:

 mysqli_set_charset($dblink, "utf8");    

См. http://php.net/manual/en/mysqli.set-charset.php длябольше информации

6 голосов
/ 26 марта 2011

Проверьте, правильно ли кодируется utf-8 любой из ваших .php файлов, которые печатают какой-либо текст.

5 голосов
/ 20 января 2016

Скажите PDO сначала charset .... что-то вроде

PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password);

Обратите внимание: charset=utf8; part.

надеюсь, это поможет!

2 голосов
/ 22 июня 2012

Похоже, никто не упомянул

SET NAMES utf8;

Я нашел это решение здесь , и оно мне помогло. Как его применить:

Чтобы быть полностью UTF-8, выполните следующую инструкцию сразу после того, как вы установили соединение с сервером базы данных: SET NAMES utf8;

Может быть, это кому-нибудь поможет.

2 голосов
/ 26 марта 2011

Я из Бразилии, и я создаю свои базы данных, используя latin1_spanish_ci. Для HTML и всего остального я использую:

charset=ISO-8859-1

Данные идут правильно с é, ã и ç ... Иногда мне приходится помещать тексты HTML, используя его код, например:

Ol&aacute;

дает мне

Olá

Вы можете найти коды на этой странице: http://www.ascii.cl/htmlcodes.htm

Надеюсь, это поможет. Я помню, это было действительно раздражает.

1 голос
/ 27 марта 2011

Проблема заключается в кодировке, используемой apache для обслуживания страниц. Я работаю с Linux, поэтому я ничего не знаю о XAMPP. У меня была такая же проблема, я решил добавить кодировку в файл конфигурации 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

Надеюсь, это поможет.

...