#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>";