Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.12;
Скачать: CL | DM;

Вниз

PCRE и русская локаль   Найти похожие ветки 

 
федот   (2009-05-11 09:06) [0]

Добрый день уважаемые.

Появилась необходимость в программе на Delphi использовать регулярные выражения Perl.
Библиотека TRegExpr не подходит, так как не полностью поддерживает все выражения.
Нашел библиотеку TPerlRegEx.
Библиотека отличная, всем устраивает, но есть одна проблема, которая не дает её использовать. Не могу добиться того что бы она понимала русскую локаль. В класс \w не входят символы кириллицы, а нужно что бы входили.

Перечитал всю документацию, какую только нашел. Везде говорится, что локаль легко меняется с помощью либо стандартной (видимо только для С) функции SetLocale, либо установкой переменных окружения: LC_ALL, LCC_ALL, LC_CTYPE. Но на сколько я понял это все какие-то специфичные вещи для Unix или С. Пробовал создавать переменные окружения и прописывать им локаль. Не получается ничего.

Странно то, что библиотека TPerlRegEx судя по коду должна учитывать текущую локаль, потому что при инициализации создаются таблицы символов вызовом функции pcre_maketables, а потом указатель на эту таблицу используется везде (все как сказано в документации).
В документации написано, что функция pcre_maketables, учтет текущую локаль и построит таблицу. Но не понятно как она её получает и почему не работает это на русской Windows.

Пробовал как Ansi-версию, так и Unicode.

Может быть, кто-то использовал и может помочь?


 
федот   (2009-05-11 20:15) [1]

help ребята


 
palva ©   (2009-05-11 20:48) [2]

А setlocale вызвать не пробовали? Из msvcrt.dll


 
antonn ©   (2009-05-11 23:05) [3]


> Везде говорится, что локаль легко меняется с помощью либо
> стандартной (видимо только для С) функции SetLocale, либо
> установкой переменных окружения: LC_ALL, LCC_ALL, LC_CTYPE.
>  Но на сколько я понял это все какие-то специфичные вещи
> для Unix или С

так то наверное для php говорилось :)
setlocale( LC_CTYPE, array("ru_RU.CP1251", "rus_RUS.1251"));


 
федот   (2009-05-11 23:20) [4]

palva
Огромное спасибо!!!
Получилось для анси варианта( д2007 и меньше) (адаптирую для 2009)

function SetLocale(psz: Integer; locale: PAnsiChar): PAnsiChar; cdecl;
 external "msvcrt.dll" name "setlocale";

SetLocale(0, PAnsiChar("ru"));


 
федот   (2009-05-12 15:42) [5]

Отписываюсь о путях решения для будущих поколений.

[b]Решение №1[/b]
Локаль можно установить с помощью функции setlocale из msvcrt.dll.

[SRC delphi]
const
 // Locale categories (from <locale.h>)
 LC_ALL                    = 0;
 LC_COLLATE                = 1;
 LC_CTYPE                  = 2;
 LC_MONETARY               = 3;
 LC_NUMERIC                = 4;
 LC_TIME                   = 5;

function SetLocale(category: Integer; locale: PAnsiChar): PAnsiChar; cdecl;
 external "msvcrt.dll" name "setlocale";
...
begin
 SetLocale( LC_ALL, PAnsiChar("ru") );
end;
[/SRC]

Но все получилось только в ANSI-варианте. В unicode варианте результата добиться не удалось.
Но меня и такой вариант устраивает.

[b]Решение №2[/b]

http://www.renatomancuso.com/software/dpcre/dpcre.htm

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

Причем интересно что тут используется более старая версия prce.dll, в которой несколько другой набор функций, среди которых есть функция pcre_setlocale.



Страницы: 1 вся ветка

Текущий архив: 2009.07.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
15-1241861566
xayam
2009-05-09 13:32
2009.07.12
ExtJS и форматированный вывод


2-1242651148
Wadim005
2009-05-18 16:52
2009.07.12
Как организовать поиск текста по шаблону?


15-1242105705
vajo
2009-05-12 09:21
2009.07.12
Антенна "Логос-91"


15-1242218440
Медвежонок Пятачок
2009-05-13 16:40
2009.07.12
забороть HTTP протокол


2-1242301358
Nil
2009-05-14 15:42
2009.07.12
Объясните пож про сглаживание?