Russian Qt Forum
Май 05, 2024, 19:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QRegExp и кириллица  (Прочитано 5035 раз)
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 регулярку принимают нормально и вхождения находят. Помогите плиз найти ошибку.
« Последнее редактирование: Июль 22, 2011, 07:48 от altai » Записан
zenden
Гость
« Ответ #1 : Июль 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");


Записан
altai
Гость
« Ответ #2 : Июль 22, 2011, 07:48 »

zenden, спасибо, проблема решена, думал придется регулярку в Юникод переводить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 20.