Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.003 c
4-1212582600
Dmitry_177
2008-06-04 16:30
2009.07.12
как включить/выключить звук в системе?


15-1241855353
Riply
2009-05-09 11:49
2009.07.12
Guav, с днем рожденья !


4-1212458021
kroenen
2008-06-03 05:53
2009.07.12
Народ если кто в теме помогите плз найти хэндл АдресБара в Опере


2-1242997016
cyber-pilot
2009-05-22 16:56
2009.07.12
Директива inline


15-1241901005
Юрий
2009-05-10 00:30
2009.07.12
С днем рождения ! 10 мая 2009 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский