вторник, 25 января 2011 г.

Кодировка Windows-1251 в Kohana 3.0

На фреймворк Kohana я наткнулся в тот момент, когда только готовился финальный релиз версии 3.0. Т.к. он мне довольно таки понравился, было решено попробовать реализовать на нем один небольшой проект. Незнание данного фреймворка осложнялось почти полным отсутствием документации. В добавок к этому, в проекте мне понадобилось использовать кодировку CP-1251.

Наивно полагая, что для этого достаточно будет поменять локаль в bootstrap.php на:

setlocale(LC_ALL, 'ru_RU.cp1251');  

я был неприятно удивлен. Вместо «Привет!» в браузере отобразилось «������!», т.е. кодировка по умолчанию не переключилась на CP-1251, а осталась UTF-8.

Не помогала даже строка html-шаблона:

<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251"> 

призванного заставить браузер отображать виндовскую кодировку.

Поиск по форумам дал только понимание, что я не одинок со своей проблемой и, по крайней мере, пара человек уже задавалась таким же вопросом. Вразумительных ответов там не нашлось. Вместо этого умные люди старались убедить вопрошающих, что Kohana  впринципе не может работать с CP-1251 в силу своей врожденной заточенности под UTF-8.  Все «помогающие» сходились в одном мнении, что давно уже пора забить на древнюю и никому ненужную CP-1251 и переходить на вездесущий Unicode, и будет всем счастье.

Однако такой расклад меня не устраивал, да и в версию с особой заточенностью Коханы под одну единственную кодировку верилось с трудом. Логические размышления подсказали, что такое странное поведение браузеров вызвано неправильным HTTP-заголовком, который отправляет сервер, с подачи любимой Коханы. А значит, нужно его как-то исправить. Мануал в силу своей скудности на момент этих моих экспериментов ответов не давал, и пришлось копать код. Это привело меня к свойству charset класса Kohana, которое как окзалось можно определить в методе init(), добавив туда элемент  'charset' => 'cp1251'.  И поправив bootstrap.php еще разок,

Kohana::init(array(
 'base_url'   => '/',
 'index_file' => FALSE,
 'charset'    => 'cp1251', 
 'caching'    => FALSE,
));

я получил таки желаемый результат - Кохана заговорила по-русски в виндовской кодировке.

В довершение оставалось только заставить базу данных отдавать данные в нужном виде. Добиться этого оказалось не сложно, достаточно было изменить charset в config/database.php.

Вот и все. Кохана полностью готова к работе с кодировкой  CP-1251.