Форум: "Прочее";
Текущий архив: 2009.07.12;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c