Вопросы по работе рег. выражений с кодировкой UTF-8

Онегин

Новичок
Вопросы по работе рег. выражений с кодировкой UTF-8

Здравствуйте, никогда не работал с utf, но появилась необходимость и появились вопросы по теме. Помогите разобраться.

$string="тестовая Запись в строку";

1)
PHP:
echo preg_replace ("/запись/ui",'*$1*', $string); // Работает правильно
Я в одной статье читал, что модификатор /i для utf для символов кириллицы не работает, что нужно предварительно отдельно преобразовывать строку в нижний регистр а потом обрабатывать регуляркой, так ли это ? я протестировал у себя, вроде модификатор /i нормально работает с кириллицей. но вдруг на хостинге проблема может появится ?

2)
PHP:
echo preg_replace ("/(\bзапись\b)/ui",'*$1*', $string); // Не работает
\b почему то не работает, я что то неправильно делаю ?

3)
PHP:
echo mb_ereg('^([а-яА-ЯёЁ ]+)$',$string);
Эта строчка какието символы пропускает а какие то нет, а как же быть ? Если не указывать диапазон, а перечислить все символы русского алфавита то работает нормально (с английскими проблем нет, работает a-zA-Z) вот так :
PHP:
echo mb_ereg('^([абвгдеёжзиёклмнопрстуфхцчшщьъыэюяАБВГДЕЁЖЗИЁКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ ]+)$',$string);
нельзя ли сократить все таки запись ?
Еще mb_ereg неправильно считает кол-во символов если использовать {1,10}. Я понимаю что русские символы кодируются 2мя байтами, но preg_match это делает правильно.

4)
PHP:
echo mb_ereg ('^(тестовая Запись в строку)$',$string); // Работает правильно  
echo mb_eregi ('^(тестовая запись в строку)$',$string); // Не работает, не должен учитывать регистр, но учитывает. Почему ?
 

Bu-Bu

Любитель PHP
function PHPruLow($string)
{
$down = strtr($string,
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ',
'абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz');
return $down;
}

Самый надежный вариант. Не только UTF грешит равнодушием к русским буквам
 

dimagolov

Новичок
Онегину тебя скрипт в UTF? locale какой стоит?

п.с. равнодушием к русским буквам грешит неправильный locale.
 

Bu-Bu

Любитель PHP
Просто, не в плане дискуссии, а в плане справки - у меня, начиная с httpd.conf и кончая заголовками html везде прописано windows-1251, однако большие буквы игнорируются только так
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
Bu-Bu, потому что locale для php там никак не устанавливается
http://www.php.net/manual/en/function.setlocale.php
А кто ее будет устанавливать из хостеров? Если у каждого своя кодировка и некоторые пользуют уж совсем экзотические. Ты все время забываешь, что только единицы имеют доступ к конфигурационным файлам сервера
 

dimagolov

Новичок
Bu-Bu, по ссылке в ман сходить религия не позволяет? там ни слова про конфиг сервера нету, там сказано, что установить можно локаль, которая есть на сарвере, а обычно все нужные русские локали есть на 99% хостингов, по крайней мере в россии.
 

Bu-Bu

Любитель PHP
Ах пардон, неправильно понял. Нужно будет проверить эту фишку, но вопрос - как. Есть гарантия, что с этой функцией всегда и везде будут регэкспы срабатывать? Спрашиваю не из праздного любопытства.
 

dimagolov

Новичок
Bu-Bu, поищи по форуму по слову locale. 99.9% вопросов про русский язык в regexp сводятся к этому, там же множество советов как определять наличные локали и т.п.

-~{}~ 12.08.08 15:31:

да, проще всего на unix из shell посмотреть установленные локали так:
ls /usr/share/locale
 

Bu-Bu

Любитель PHP
Тогда в догонку еще вопрос - а если контент собран с нескольких разных сайтов и там и UTF, и WIN1251 и koi8-r, прости меня госсспадя. Какими локалями этот борщ успокаивать? Или делать тотальную перекодировку?
 

dimagolov

Новичок
ну где-то ты их хранишь? хранишь в базе, у которой есть строго определенныя кодировка и заносить туда что-то в иной не кузяво (гемор будет). вот преред хранением нужно перекодировать в свой стандарт и уже сохранять в стандартной кодировке.
только для всего этого надо точно знать из какой кодировки преобразуешь. обычно это известно из заголовков, но иногда надо автоопределять. для этого специальные методы есть - см. поиском, обсуждалось не раз уже.

-~{}~ 12.08.08 15:58:

но правильная кодировка это utf :)
 

Bu-Bu

Любитель PHP
Автор оригинала: dimagolov
ну где-то ты их хранишь? хранишь в базе, у которой есть строго определенныя кодировка и заносить туда что-то в иной не кузяво (гемор будет). вот преред хранением нужно перекодировать в свой стандарт и уже сохранять в стандартной кодировке.
только для всего этого надо точно знать из какой кодировки преобразуешь. обычно это известно из заголовков, но иногда надо автоопределять. для этого специальные методы есть - см. поиском, обсуждалось не раз уже.

-~{}~ 12.08.08 15:58:

но правильная кодировка это utf :)
Я хоть и любитель, но изготовил пару фич, одна из которых бегает по ссылкам поисковиков и ищет некоторый контент по моим темам. А чтоб в этом кишмише (около 3мб за сессию) было легче разобраться, то я при записи объявлял strtolower, однако больше половины текста так и забивалось в верхнем регистре пока я не сделал принудительные процедуры. А перекодировать лениво, потому как это справочная информация, которая после определенного анализа просто удаляется без устатку.

P.S. Правильная кодировка - абвгджзеик, остальное все изврат в угоду проклятым капиталистам.
 

Онегин

Новичок
Я уже начинал копать в сторону локали, вероятно это было правильное направление )
PHP:
LC_CTYPE=Russian_Russia.1251;
Но с локалью опять вопросы.
Читаю что в разных системах локали называются по-разному, тем более в *nix и win.
Локалхост у меня под win, как вывести список локалей на моей машине пока не понял, пытаюсь подставлять разные варианты и найти тот что для utf.

-~{}~ 13.08.08 03:34:

http://msdn.microsoft.com/en-us/library/x99tb11d.asp :
The set of available languages, country/region codes, and code pages includes all those supported by the Win32 NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. If you provide a code page like UTF-7 or UTF-8, setlocale will fail, returning NULL. The set of language and country/region codes supported by setlocale is listed in Language and Country/Region Strings.
Для кодировок требующих больше двух байт, таких как UTF-7 и UTF-8, setlocale всегда возвращает NULL.

А чего ж делать то :confused:
 
Сверху