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" />
  • Для тестирования я устанавливал используемый header('Content-Type: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 

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

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

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

Итак, для MySQLi я сделал:

  mysqli_set_charset($dblink, "utf8"); 

См. http://php.net/manual/en/mysqli.set-charset.php для получения дополнительной информации

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

Сначала charset PDO о своей charset …. что-то вроде

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

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

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

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

 SET NAMES utf8; 

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

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

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

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

 charset=ISO-8859-1 

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

 Ol&aacute; 

дает мне

 Olá 

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

Надеюсь это поможет. Я помню, это было ДЕЙСТВИТЕЛЬНО раздражающим.

Проблема заключается в кодировке, которая используется 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 

Я надеюсь, что это помогает.