Russian Qt Forum

Qt => Вопросы новичков => Тема начата: altai от Июля 21, 2011, 19:32



Название: [Решено] QRegExp и кириллица
Отправлено: altai от Июля 21, 2011, 19:32
Доброго всем времени суток, возникла проблема использование QRegExp для кириллицы, не находятся вхождения для строки:
344039, Россия, Ростовская область, Шахты, Некий переулок, 12
Код:
QRegExp rx1("^\\d{6}\\,\\s[А-Я][а-я]*\\,\\s[А-Я][а-я]*\\s[а-я]*\\,\\s[А-Я][а-я]*\\,\\s[А-Я][а-я]*\\s(улица|переулок|бульвар|шоссе)\\,\\s\\d*");
QFile *file = new QFile("input.txt");
    if (file->open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream in(file);
        while (!in.atEnd()) {
              QString line = in.readLine();
              if (rx1.indexIn(line.toUtf8()) != -1 )
                  printf("There\n");
              else
                  printf("Fail\n");

          }
        file->close();
    }
    else
    {
        printf("File open error");
    }
При использовании QRegExp rx1("Ростовская\\s");  находит, значит кодировка подгружается нормально. Regex Coach и дефолтный RegExp регулярку принимают нормально и вхождения находят. Помогите плиз найти ошибку.


Название: Re: QRegExp и кириллица
Отправлено: zenden от Июля 21, 2011, 21:41
Я взял ваш код и проверил. Программа печатает There.

Значит у вас проблема именно в кодировке.

rx1.indexIn(line.toUtf8()) -> здесь преобразовывать ничего не нужно, достаточно написать
Код:
rx1.indexIn(line)

Все проблемы с кодировками Qt решаются по единому алгоритму:

Главное помнить, что QString ВСЕГДА хранит строку в кодировке UTF-16. Ваша задача - добиться того, чтобы все данные в других кодировках были преобразованы в QString правильно.

Вы должны четко понимать, в какой кодировке хранятся исходные коды вашей программы. Предположим, что это utf-8 без BOM. Для такого случая нужно написать в начале программы
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));

Вы должны точно знать, в какой кодировке ваши входные данные (файл "input.txt"). Некоторые кодировки Qt может распознать сама, про другие ей надо подсказать. (Qt может распознать кодировку, только если вначале файла стоит метка BOM (Byte Order Mark)).
Если же, например, файл сохранен в кодировке windows-1251, нужно об этом сообщить классу QTextStream:
Код
C++ (Qt)
in.setCodec("windows-1251");




Название: Re: QRegExp и кириллица
Отправлено: altai от Июля 22, 2011, 07:48
zenden, спасибо, проблема решена, думал придется регулярку в Юникод переводить.