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

#php #cakephp #utf-8 #character-encoding #iso-8859-1

#php #cakephp #utf-8 #кодировка символов #iso-8859-1

Вопрос:

На сервере моего клиента, когда я просматриваю приложение, символы неверны, потому что все браузеры (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');
      
  • В database.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. Я думаю, что это модуль или опция на клиентском сервере, потому что локально и на моем сервере работает нормально.

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

Комментарии:

1. Вы должны попытаться вручную установить кодировку символов в <meta>

2. Я забыл упомянуть, что у каждой страницы есть мета. Теперь я отредактировал вопрос, добавив это.

3. Возвращается ли какой-либо заголовок HTTP, который указывает кодировку? Проверьте, например, с curl -i http://... помощью .

4. Я не знаю, как это проверить. [HTTP_ACCEPT_CHARSET] => ISO-8859-1, utf-8; q = 0.7, *; q = 0.7 это полезно?

5. Единственные способы, которые я могу придумать, чтобы помочь отследить эту ошибку: 1) просмотреть исходный код и убедиться, что разметка <meta> соответствует ожиданиям, и 2) просмотреть заголовки, которые получает браузер, используя какое-либо расширение браузера или инструмент веб-разработки.

Ответ №1:

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

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

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

Ответ №2:

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

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

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

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

Комментарии:

1. Нет, root .htaccess имеет AddDefaultCharset utf-8

2. На стороне сервера не должно быть никаких других файлов, которые могли бы вызвать это, поэтому вы, вероятно, где-то что-то упускаете, но я не могу точно понять, где это может быть, похоже, вы рассмотрели все основы. К счастью, здесь есть люди поумнее меня, так что, надеюсь, один из этих людей будет знать, где искать. Если это общий веб-сервер, вы можете проверить у хоста, чтобы убедиться, что это не что-то на их стороне.

3. Если я что-то пропустил, в этом случае приложение не работает локально и на другом сервере. Но это работает. Это должно быть что-то на моем клиентском сервере. В любом случае спасибо.

4. Вероятно, вы правы, но может быть что угодно? Клиентский сервер мог настроить Apache по-другому, использовать другую версию PHP, возможно, suPHP, и отсутствующее объявление кодировки может создать проблему на клиентском сервере, а не на вашем локальном сервере. Также может быть, что хост сделал что-то не так в файлах конфигурации вашего веб-сервера, поэтому свяжитесь с ними и спросите, могут ли они проверить свою сторону или перезапустить сервер для вас.

Ответ №3:

параметры сортировки базы данных могут отличаться от параметров сортировки для 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>";