Главная страница
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
2-1243005859
Tatarin
2009-05-22 19:24
2009.07.12
Оптимизиция DirectX движка


2-1242837940
Dr.Andrew
2009-05-20 20:45
2009.07.12
Как строку short *s=(short*)buffer можно перевести на делфи?


15-1242057717
Rouse_
2009-05-11 20:01
2009.07.12
Ну воть, собственно о чем и говорилась фомам неверующим


2-1242807787
Den1111
2009-05-20 12:23
2009.07.12
Организация поиска "Далее"


15-1242160207
Юрий
2009-05-13 00:30
2009.07.12
С днем рождения ! 13 мая 2009 среда