Dubrowsky
Хроники одного дупла
Блогово  →  WebDev  → 

Устанавливаем русскую локаль на Linux

07 Апреля 2012 года

Если вдруг кто заметил, у меня на бложеке появился фильтр русского мата! В действии можно посмотреть например в посте про лук, предсказуемо содержащем неприличное слово. Как это сделано - напишу чуть позже. Пока кодил - столкнулся с проблемой: на моем новом сервере (куда я переехал с Агавы в начале года) не было русских локалей, вообще. Соответственно, регулярки не ловили слово из трех букв, если первая буква - заглавная, например. Пришлось устанавливать, а заодно писать очередной пост в "красноглазие".

Установил, работает. Записываю на память, пошагово.

1. Проверяем, что есть русского

> locale -a | grep ru

Должен показать локали, содержащие "ru" в названии. В моем случае не показал ничего.

2. Проверяем, что вообще есть

> locale -a

Отображает установленные в системе локали - все, какие есть. У меня оказалось:

C
POSIX

Не густо, ага :(

3. Смотрим локали доступные, но не установленные:

> cd /usr/share/i18n/locales/
> ls -la | grep ru

То есть переходим в папку, откуда ставятся локали, и ищем там файлы с подстрокой "ru". Я нашел такие:

-rw-r--r-- 1 root root    5445 Jun  6  2010 ru_RU
-rw-r--r-- 1 root root    5157 Jun  6  2010 ru_UA

4. Смотрим чармэпы:



> cd /usr/share/i18n/charmaps/
> ls -la | grep 1251

Меня интересует кодировка windows-1251, поэтому я и искал charmap-файл с этой кодировкой. Нашел вот что:

-rw-r--r-- 1 root root   2873 Jun  6  2010 CP1251.gz

5. Делаем локальдеф

> localedef -i ru_RU -f CP1251 ru_RU.CP1251

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

6. Проверяем, что локаль добавилась

> locale -a

Ну, как во втором пункте, но теперь с другим результатом:

C
POSIX
ru_RU.cp1251

Ура, есть контакт!

6. Перезапускаем апач

> /etc/init.d/apache2 restart

У меня до перезапуска веб-сервера ничего не запахало. Капитан Очевидность подсказывает, что команда выше работает для Apache 2 :)

7. Пишем тест

Если все заработало, регулярки с модификатором i (case insensitive) должны находить заглавные буквы. Проверяем, так ли это:

<?
putenv ("LC_ALL=ru_RU");
$locale = setlocale(LC_ALL, 'ru_RU.cp1251');
echo "Locale is '".$local."'";
preg_match_all('~[а-я]~i', 'Раз дВа', $matches);
echo "<pre>".htmlspecialchars(print_r($matches,1))."</pre>";
?>

У меня заработало, завидуйте :) "Заработало" - значит, что я могу например при помощи strtoupper() получить из строки готовые оффшорные компании строку "ГОТОВЫЕ ОФФШОРНЫЕ КОМПАНИИ", или искать по этой строке регулярками, регулируя чувствительность к регистру.

Написать коммент: памятка постеру

 

Крутые посты wtf??? →

02.10.2012 · 94 каммента · рейтинг 13.73
27.06.2012 · 37 камментов · рейтинг 8.5
28.04.2008 · 44 каммента · рейтинг 7.8
29.08.2007 · 28 камментов · рейтинг 6.09
30.01.2013 · 13 камментов · рейтинг 5.19

Последне камменты

23.06.2022  Артур Кадыров РоссияЯндекс - калькулятор онлайн, в поиске, встречайте!: Почему ты люди вас хватит говорит? А если ремни бо...
09.06.2022  Танк Жопа жопа жопатам же: 222235555522221242424242
09.06.2022  Танк Живыетам же: Покажи ЖОПА покажи придурак порно
29.05.2022  мой шумный домтам же: А у меня 5 "А" сл. 1 сентября 6 "А"
29.05.2022  Артуртам же: У меня 3"Б" класс а следушие 1 сентября 4"Б" класс

Статсы