pcre и win1251
От: PauloMaldini  
Дата: 19.03.08 08:38
Оценка:
Здравствуйте.
Использую в программе на С++( среда Visual Studio 2003 )библиотеку регулярных выражений PCRE в виде DLL. Проблема заключается в работе с выражениями на русском языке. Ниже приведен пример:

#include <tchar.h>
#include <string.h>
#include <locale.h>
#include <stdio.h>
#include "pcre.h"

int _tmain(int argc, _TCHAR* argv[])
{
    if( !setlocale( LC_ALL, "Russian_Russia.1251" ) )
    {
        printf( "Локаль не установлена" );
        return 0;
    } 
    const unsigned char* char_tables = pcre_maketables(); //pcre-загрузка текущей локали
    char* pattern = "(\\bслово\\b)"; //шаблон
    const char* errstr;
    int errchar;
    pcre* cmpld_pat = pcre_compile( //компилируем шаблон
                                     pattern,
                                     PCRE_CASELESS, 
                                     &errstr,
                                     &errchar, 
                                     char_tables 
                                  );
    
    char* str = "Честное слово"; //строка для поиска
    int vector[50];
    int vsize = 50;
    int pairs = pcre_exec( //выполняем поиск на соответствие
                           cmpld_pat,
                           NULL,
                           str, 
                           strlen( str ),
                           0,
                           PCRE_NOTEMPTY,
                           vector,
                           vsize 
                         );
    if( pairs < 0 )
        printf( "Соответствие не найдено" );
    else
        printf( "Соответствие найдено" );   
    
    return 0;
}


Функция setlocale отрабатывает нормально, локаль устанавливается. А вот соответствие не обнаруживается.
Если используется латинница, то все работает. Подскажите, пожалуйста, в чем может быть проблема?
Re: pcre и win1251
От: Qbit86 Кипр
Дата: 19.03.08 08:55
Оценка:
Здравствуйте, PauloMaldini, Вы писали:

PM>Функция setlocale отрабатывает нормально, локаль устанавливается. А вот соответствие не обнаруживается.

PM>Если используется латинница, то все работает. Подскажите, пожалуйста, в чем может быть проблема?

В какой кодировке заданы строковые литералы?
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: pcre и win1251
От: PauloMaldini  
Дата: 19.03.08 09:03
Оценка:
Кодировка — 1251
Re: pcre и win1251
От: Roman Odaisky Украина  
Дата: 19.03.08 09:23
Оценка: +1
Здравствуйте, PauloMaldini, Вы писали:

PM> Использую в программе на С++( среда Visual Studio 2003 )библиотеку регулярных выражений PCRE в виде DLL. Проблема заключается в работе с выражениями на русском языке. Ниже приведен пример:


Во-первых, используй std::tr1::regex.

Во-вторых, однобайтовые кодировки — это зло.

А в-третьих, вот так работает:
#include <boost/regex.hpp>
#include <boost/regex/icu.hpp>
#include <iostream>

int main()
{
    boost::u32regex const re = boost::make_u32regex("\\bслово\\b");

    char const data[] = "Честное слово";

    std::cout << std::boolalpha << boost::u32regex_search(data, re) << std::endl;
}
До последнего не верил в пирамиду Лебедева.
Re[2]: pcre и win1251
От: PauloMaldini  
Дата: 20.03.08 06:42
Оценка:
Roman Odaisky, спасибо за совет
Re[3]: pcre и win1251
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.03.08 07:54
Оценка:
Здравствуйте, PauloMaldini, Вы писали:

PM>Roman Odaisky, спасибо за совет


С тем же успехом можно использовать и PCRE. В режиме Utf-8 сравнение без учета регистра выполняется на ура. Я так PCRE в одном из проектов использую -- с помощью libiconv преобразовываю текст из разных кодировок в utf8, а затем пропускаю через PRCE.

Кстати, начиная, по-моему, с версии 7.0 в состав PCRE входит хороший С++ wrapper для PCRE, написанный в Google (см. заголовочный файл pcrecpp.h). С его помощью работать с PCRE очень просто и удобно.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: pcre и win1251
От: Roman Odaisky Украина  
Дата: 20.03.08 08:11
Оценка:
Здравствуйте, eao197, Вы писали:

E>С тем же успехом можно использовать и PCRE. В режиме Utf-8 сравнение без учета регистра выполняется на ура. Я так PCRE в одном из проектов использую -- с помощью libiconv преобразовываю текст из разных кодировок в utf8, а затем пропускаю через PRCE.


У UTF-8 есть проблемы с регулярными выражениями. Если особая поддержка UTF-8 отсутствует, то выражения вроде «пр[ио]бежала?» будут работать очень странно, потому что парсер воспримет данные буквально — как "пр[\xD0\xB8\xD0\xBE]бежал\xD0\xB0?" — и будет действовать побайтно. Так что с этим следует быть осторожным. Тот же boost::make_u32regex(char const *) выполняет перекодирование из UTF-8, а другие могут этого и не делать.

E>Кстати, начиная, по-моему, с версии 7.0 в состав PCRE входит хороший С++ wrapper для PCRE, написанный в Google (см. заголовочный файл pcrecpp.h). С его помощью работать с PCRE очень просто и удобно.


Я потому советую Boost.Regex, что они простые и что они будут включены в C++09.
До последнего не верил в пирамиду Лебедева.
Re[5]: pcre и win1251
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 20.03.08 08:27
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, eao197, Вы писали:


E>>С тем же успехом можно использовать и PCRE. В режиме Utf-8 сравнение без учета регистра выполняется на ура. Я так PCRE в одном из проектов использую -- с помощью libiconv преобразовываю текст из разных кодировок в utf8, а затем пропускаю через PRCE.


RO>У UTF-8 есть проблемы с регулярными выражениями. Если особая поддержка UTF-8 отсутствует, то выражения вроде «пр[ио]бежала?» будут работать очень странно, потому что парсер воспримет данные буквально — как "пр[\xD0\xB8\xD0\xBE]бежал\xD0\xB0?" — и будет действовать побайтно. Так что с этим следует быть осторожным.


У PCRE есть специальная опция: определение SUPPORT_UTF8 при компиляции PCRE включает нормальную поддержку Utf8. Приведенный вами пример у меня работает нормально.

RO>Тот же boost::make_u32regex(char const *) выполняет перекодирование из UTF-8, а другие могут этого и не делать.


А make_u32regex сам это делает, или нужно тащить за собой еще и ICU framework?

E>>Кстати, начиная, по-моему, с версии 7.0 в состав PCRE входит хороший С++ wrapper для PCRE, написанный в Google (см. заголовочный файл pcrecpp.h). С его помощью работать с PCRE очень просто и удобно.


RO>Я потому советую Boost.Regex, что они простые и что они будут включены в C++09.


Если уж человек взял PCRE, то ему может быть проще на нем же и остаться.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: pcre и win1251
От: PauloMaldini  
Дата: 20.03.08 08:55
Оценка:
Здравствуйте, eao197
Воспользовался вашим советом, через UTF-8 все заработало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.