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

Hayate

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

keltanas

marty cats
Есть такая логическая задача, называемая Загадка Эйнштейна. Так вот все это описание мне эту задачу напоминает.

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

Hayate

Новичок
что пишет, если русские символы жестко передавать в шаблон?
Если в скрипте вписать тупо 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?
Нет, не используется. Сейчас ещё настройки посмотрю в соответствии с выясненным.
 

Hayate

Новичок
На тестовом сделал те же настройки, но строки пустые.
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)
"Жёсткий вывод" отрабатывает также нормально, всё выводит корректно.
 

keltanas

marty cats
А если передавать в смарти текст как:
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 проверь, какую он там кодировку ставит?)
 

Hayate

Новичок
А если передавать в смарти текст как:
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.
 

keltanas

marty cats
Меня терзают смутные сомнения. Тебе надо привести все либо к utf-8, либо к cp1251.
Какая версия PHP установлена на этом CentOS?
На чем пишешь? Это какой-то cms/framework или собственная разработка? Там smarty используется напрямую и без модификаций, или через какую-то обертку?
Что будет, если создать отдельный скрипт, который будет выполнять простой шаблон smarty без прочего окружения? И что из себя представляет твой шаблон? Нет ли там каких-то модификаторов?
Я что-то не помню, чтобы со смарти, даже со второй версией, были какие-то проблемы кодировки.
 
Сверху