Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > mb_eregi и регистр русских букв


Автор: unicross 30.1.2009, 04:57
Есть скрипт в кодировке UTF-8 без BOM следующего содержания:
Код

<?php
mb_internal_encoding('UTF-8'); // Установка кодировки
mb_regex_encoding('UTF-8'); // Установка кодировки
//mb_regex_set_options('isz');
// Настройка локали ни на что не влияет...
//setlocale(LC_ALL, 'ru_RU.UTF-8');

/////////////////////////////////////////////////////////////////
echo mb_eregi('г', 'Г'), '<br>'; // НЕ РАБОТАЕТ !!!
echo mb_ereg_match('г', 'Г', 'isz'), '<br>'; // НЕ РАБОТАЕТ !!!
/////////////////////////////////////////////////////////////////

echo preg_match('/г/iu', 'Г'), '<br>'; // Все РАБОТАЕТ !!!
echo mb_strtoupper('г', 'UTF-8'), '<br>'; // Работает
echo mb_regex_encoding(), '<br>'; // Вывод UTF-8
echo mb_internal_encoding(), '<br>'; // Вывод UTF-8
echo mb_regex_set_options(); // Вывод pr
?>


Как заставить функции mb_eregi() и mb_ereg_match() НЕ учитывать регистр русских букв??? smile 

И почему настройка локали ни на что не влияет?
Код

setlocale(LC_ALL, 'ru_RU.UTF-8');

Изменение регистра символов работает без настройки локали...

P.S. ОС Windows, PHP 5.2.8
P.S.S. Вариант mb_eregi('[гГ]', 'Г') не предлагать. Это и так понятно...

Автор: skyboy 30.1.2009, 10:17
как на счет "зайти с другой стороны"? зачем тебе устаревшие eregi*? может и работать с preg_*?

Автор: unicross 30.1.2009, 14:38
Цитата(skyboy @  30.1.2009,  10:17 Найти цитируемый пост)
как на счет "зайти с другой стороны"? зачем тебе устаревшие eregi*? может и работать с preg_*?

Это все правильно конечно. preg_* в 100 раз лучше по всем показателям. smile На практике использую только их smile 
Просто хочется понять почему eregi() в windows-1251 работает, а mb_eregi() в UTF-8 не хочет...
Может я локаль не правильно настраиваю?

skyboy, у вас работает мой код?

Автор: unicross 30.1.2009, 22:45
У кого-нибудь вообще работает корректно функция mb_eregi() ? smile 

Автор: unicross 1.2.2009, 02:47
Похоже проблема не в функции mb_eregi(), а в настройке локали под Windows!!!

Во-первых, локали ru_RU.UTF-8 в Windows не существует. Вместо нее используется локаль Russian_Russia.65001. 
Во-вторых, проблема заключается в том, что при установке изменяется все типы, кроме LC_CTYPE. А от этого типа зависит учет регистра символов и соответственно функция mb_eregi().

Код

echo setlocale(LC_ALL, 'Russian_Russia.65001'), PHP_EOL;

Вывод:
Цитата
LC_COLLATE=Russian_Russia.65001;
LC_CTYPE=Russian_Russia.1251;
LC_MONETARY=Russian_Russia.65001;
LC_NUMERIC=Russian_Russia.65001;
LC_TIME=Russian_Russia.65001

Как изменить LC_CTYPE?  smile 

Цитата
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.

Это значит вообще нельзя изменить?

Автор: unicross 4.2.2009, 23:22
Цитата(Ilya Tumanov)

Это не баг, а фича. smile Нет, серьезно - даже документированная.  

Проблема не в ОС, а в имплементации C++ библиотек. Скорее всего все функции для работы со строками просто не могут работать с символами длиннее 2 байт в мультибайтовых строках, вот и поставить их нельзя. Должно ли это вообще работать или нет - надо смотреть в ANSI стандарте не библиотеки C++ (где это скорее всего не специфицировано и на усмотрение вендора).

Программы для Windows обычно не наеезжают на подобные проблемы ибо для них типичен другой способ глобализации. А именно: вместо возни с кодировками и строками с символами переменной длинны (брр...) просто используются строки в UTF-16. Таким образом все равно какая локаль стоит (а иногда даже все равно поддерживается ли она системой или нет), манипуляции со строками резко упрощаются и ускоряются. Ну а перекодировка во что надо (UTF-8 например) делается во вводе/выводе.


Похоже проблема не решаемая. На этом тему считаю закрытой... Всем спасибо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)