Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mb_eregi и регистр русских букв, кодировка utf-8 
V
    Опции темы
unicross
Дата 30.1.2009, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



Есть скрипт в кодировке 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('[гГ]', 'Г') не предлагать. Это и так понятно...

PM MAIL WWW   Вверх
skyboy
Дата 30.1.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 8
Всего: 260



как на счет "зайти с другой стороны"? зачем тебе устаревшие eregi*? может и работать с preg_*?
PM MAIL   Вверх
unicross
Дата 30.1.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



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

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

skyboy, у вас работает мой код?
PM MAIL WWW   Вверх
unicross
Дата 30.1.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



У кого-нибудь вообще работает корректно функция mb_eregi() ? smile 
PM MAIL WWW   Вверх
unicross
Дата 1.2.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



Похоже проблема не в функции 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 - 1.2.2009, 04:03
PM MAIL WWW   Вверх
unicross
Дата 4.2.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



Цитата(Ilya Tumanov)

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

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

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


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

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0455 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.