Браузер обнаруживает кодировку ISO-8859-1 в приложении CakePHP UTF-8

На сервере моего клиента, когда я просматриваю приложение, символы неверны, потому что все браузеры (Firefox, Chrome, IE) декодируют страницу как ISO-8859-1 вместо UTF-8. Локально работает отлично, и на моем сервере тоже отлично работает.

У меня есть приложение, разработанное с помощью cakePHP 1.3.12:

  • Кодировка по умолчанию для всех файлов — UTF-8 без спецификации.
  • На всех страницах есть meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
  • В core.php

    Configure::write('App.encoding', 'UTF-8');
    
  • В базе данных.php

    var $default = array(
        'driver' => 'mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'aaa',
        'password' => 'aaa',
        'database' => 'aaa',
        'prefix' => 'app_',
        'encoding' => 'utf8'
    );
    
  • Сопоставление базы данных, таблиц и полей — utf8_unicode_ci.

Я также поставил начало bootstrap.php:

echo mb_internal_encoding();

...и возвращает ISO-8859-1, поэтому я поставил...

mb_internal_encoding('UTF-8');

...но ничего не меняется.

Сервер, который работает плохо, имеет PHP 5.2.16. Думаю дело в модуле или опции на клиентском сервере, т.к. локальный и на моем сервере работает нормально.

Любая идея приветствуется.


person Matias Beckerle    schedule 06.10.2011    source источник
comment
Вы должны попытаться вручную установить кодировку символов в <meta>   -  person Madara's Ghost    schedule 07.10.2011
comment
Я забыл упомянуть, что у каждой страницы есть мета. Теперь я отредактировал вопрос, добавив это.   -  person Matias Beckerle    schedule 07.10.2011
comment
Возвращается ли какой-либо заголовок HTTP, указывающий кодировку? Проверьте, например, с curl -i http://....   -  person deceze♦    schedule 07.10.2011
comment
Я не знаю, как это проверить. [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7 это полезно?   -  person Matias Beckerle    schedule 07.10.2011
comment
Единственные способы, которые я могу придумать, чтобы помочь отследить эту ошибку, это: 1) просмотреть исходный код и убедиться, что ‹мета›-разметка соответствует ожиданиям, и 2) просмотреть заголовки, которые получает браузер, используя какое-либо расширение браузера или инструмент веб-разработчика.   -  person luiscubal    schedule 07.10.2011
comment
Мета в порядке. Вот заголовок: Сервер Apache P3P CP=NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM Vary Accept-Encoding,User-Agent Content-Encoding gzip Content-Type text/html; charset=ISO-8859-1 Content-Length 534 Date Thu, 06 Oct 2011 23:10:19 GMT X-Varnish 958149880 Возраст 0 Через 1.1 Varnish Connection keep-alive X-Cache MISS   -  person Matias Beckerle    schedule 07.10.2011
comment
Content-Type text/html; charset=ISO-8859-1 Ну вот. Разберись, откуда это.   -  person deceze♦    schedule 07.10.2011
comment
Да, я знаю. Я не говорю ясно. Так для этого, этот вопрос. Я не знаю, кто установил этот заголовок.   -  person Matias Beckerle    schedule 07.10.2011


Ответы (3)


Я решил проблему, вставив первую строку файла app/config/bootstrap.php:

header('Content-Type: text/html; charset=utf-8');

Просто и даже кажется очевидным, но на этом хостинге приложение cakePHP не заработало так, как ожидалось. Заголовок ответа всегда отвечает Content-Type ISO-8859-1. Теперь с этим изменением он ответил на UTF-8.

person Matias Beckerle    schedule 15.10.2011

Вы можете попробовать проверить, добавлено ли в файл .htaccess на сервере что-то вроде этого:

AddType 'text/html; charset=ISO-8859-1' html

Тип MIME может быть другим, и существуют некоторые вариации в синтаксисе, но он будет выглядеть одинаково.

Это перезапишет кодировку файлов глобальной кодировкой, установленной в .htaccess.

person adeneo    schedule 06.10.2011
comment
Нет, в корневом .htaccess есть AddDefaultCharset utf-8 - person Matias Beckerle; 07.10.2011
comment
На самом деле на стороне сервера не должно быть никаких других файлов, которые могли бы вызвать это, поэтому вы, вероятно, где-то что-то упустили, но я не могу точно понять, где это может быть, похоже, вы охватили все основы. К счастью, здесь есть люди поумнее меня, так что, надеюсь, кто-то из них знает, где искать. Если это общий веб-сервер, вы можете проверить у хоста, чтобы убедиться, что это не что-то на их стороне. - person adeneo; 07.10.2011
comment
Если я что-то упустил, в этом случае приложение не работает локально и на другом сервере. Но это работает. Это должно быть что-то на моем клиентском сервере. Спасибо, в любом случае. - person Matias Beckerle; 07.10.2011
comment
Возможно, вы правы, но может быть что угодно? На клиентском сервере может быть настроен Apache по-другому, может использоваться другая версия PHP, возможно, suPHP, а отсутствующее объявление кодировки может создать проблему на клиентском сервере, а не на вашем локальном сервере. Также может быть, что хост сделал что-то не так в файлах конфигурации для вашего веб-сервера, поэтому свяжитесь с ними и спросите, могут ли они проверить свою сторону или перезапустить сервер для вас. - person adeneo; 07.10.2011

сопоставление базы данных может отличаться от сопоставления для пользователя mysql в вашем information_schema (используйте phpmyadmin, чтобы проверить это).

если у вас нет необходимых привилегий для изменения этих настроек, это может решить вашу проблему, если предположить, что заголовок вашей страницы charset имеет значение utf-8:

// Opens a connection to a MySQL server
$connection = mysql_connect ($server, $username, $password);
$charset = mysql_client_encoding($connection);
$flagChange = mysql_set_charset('utf8', $connection);
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";
person tony gil    schedule 04.12.2013