Главная страница
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.01 c
15-1242050148
and
2009-05-11 17:55
2009.07.12
система поиска изображений


4-1212582600
Dmitry_177
2008-06-04 16:30
2009.07.12
как включить/выключить звук в системе?


15-1242293947
TUser
2009-05-14 13:39
2009.07.12
25 мая - благотворительный концерт


15-1241720760
Cyrax
2009-05-07 22:26
2009.07.12
Соревнования летающих йогов... 1986 год...


15-1241778394
PROgrammist
2009-05-08 14:26
2009.07.12
Ошибка при запуске Delphi.