Smarty, кириллица, продакшен vs локалхост

  • Автор темы Автор темы Hayate
  • Дата начала Дата начала

Hayate

Новичок
Есть БД, местами там русские символы.
Если выводить текст в шаблон смарти:
$smarty->assign(array(
bla-bla-bla
));
$smarty->display('template.tpl');
То мы получаем вместо русского текста пустые строки. Латиницу выводит отлично. В отладчике данные отображаются тоже полностью корректно. Если в скрипте вписать тупо echo "$var"; то всё тоже выводится как надо. Причём на продакшене всё работает нормально, заливаю на виртуалку с centos - не работает. И там и там mysql с utf8. Хотя был бы косяк в кодировках и мускуле, в отладчике тогда тоже думаю фигня бы была.
В чём может быть проблема?
 
Есть такая логическая задача, называемая Загадка Эйнштейна. Так вот все это описание мне эту задачу напоминает.

На каких еще серверах запускал, какие OS, какие веб-сервера, какие кодировки по дефолту там стоят, какая версия смарти, в каких кодировках файлы, что пишет, если русские символы жестко передавать в шаблон?
Как ты проверял, что mysql в utf-8? Как ты проверял, в какой кодировке она выводит данные? Используется ли SET NAMES utf8?
В чём может быть проблема?
Где-то хрень с кодировкой.
 
что пишет, если русские символы жестко передавать в шаблон?
Если в скрипте вписать тупо echo "$var"; то всё тоже выводится как надо.

Больше ни на каких не запускал. На продакшене какой-то линукс, какие стоят на sweb, ssh у меня туда нет, на тестовом centos 6.4
На тестовом Apache/2.2.15, на продакшене Apache/2.0.63-lk.e (Unix).
Кодировки это сие из phpinfo:
PHP:
Directive	Local Value	Master Value
iconv.input_encoding	ISO-8859-1	ISO-8859-1
iconv.internal_encoding	ISO-8859-1	ISO-8859-1
iconv.output_encoding	ISO-8859-1	ISO-8859-1
?
Версия Smarty и там и там 2.6.12. Кодировка файлов windows-1251.
Продакшен:
show variables like 'char%'

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database cp1251
character_set_filesystem binary
character_set_results utf8
character_set_server cp1251
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

Тестовый:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

Используется ли SET NAMES utf8?
Нет, не используется. Сейчас ещё настройки посмотрю в соответствии с выясненным.
 
На тестовом сделал те же настройки, но строки пустые.
PHP:
mysql> show variables like 'char%'
    -> ;
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | cp1251                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | cp1251                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

"Жёсткий вывод" отрабатывает также нормально, всё выводит корректно.
 
А если передавать в смарти текст как:
PHP:
$smarty->assign('test', 'Раз, два, три');
Что, если сохранить шаблон на диск?
PHP:
file_put_content('test.html', $smarty->fetch('...'))
и посмотреть, что он там выдает?
> Используется ли SET NAMES utf8?
Нет, не используется. Сейчас ещё настройки посмотрю в соответствии с выясненным.
Поставь на всякий случай.

Есть ли в шаблонах (которые в cp1251) другие русскоязычные символы в этой кодировке? Или все, что без DOM - cp1251? Может стоит шаблоны перевести в utf-8?

Проверь (через FireBug какой-нибудь), что сервер выдает заголовок Content-Type: text/html; charset=utf-8 (заодно и на sweb проверь, какую он там кодировку ставит?)
 
А если передавать в смарти текст как:
PHP:
$smarty->assign('test', 'Раз, два, три');
Тоже не показывает строки содержащие русские символы.

Что, если сохранить шаблон на диск?
PHP:
file_put_content('test.html', $smarty->fetch('...'))
и посмотреть, что он там выдает?
Всё также, латиницу выводит, русские символы не выводит.

Поставь на всякий случай.
Нашёл в родителях классов было 'SET NAMES cp1251', поправил на utf8, проблема не исчезла, зато другие данные стали выводить крякозябрами.

Есть ли в шаблонах (которые в cp1251) другие русскоязычные символы в этой кодировке? Или все, что без DOM - cp1251? Может стоит шаблоны перевести в utf-8?
Это не понял.

Проверь (через FireBug какой-нибудь), что сервер выдает заголовок Content-Type: text/html; charset=utf-8 (заодно и на sweb проверь, какую он там кодировку ставит?)
И на продакшене и на тестовом Content-Type=text/html; charset=windows-1251.
 
Меня терзают смутные сомнения. Тебе надо привести все либо к utf-8, либо к cp1251.
Какая версия PHP установлена на этом CentOS?
На чем пишешь? Это какой-то cms/framework или собственная разработка? Там smarty используется напрямую и без модификаций, или через какую-то обертку?
Что будет, если создать отдельный скрипт, который будет выполнять простой шаблон smarty без прочего окружения? И что из себя представляет твой шаблон? Нет ли там каких-то модификаторов?
Я что-то не помню, чтобы со смарти, даже со второй версией, были какие-то проблемы кодировки.
 
Сверху