Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
One
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 54
#1

Проверка текста в файле не работает для русских символов

14.08.2014, 17:24. Просмотров 835. Ответов 9
Метки нет (Все метки)

Всем привет!
У меня есть QString s. Я ее получил с помощью file.readAll и преобразованием ByteArray в QString. Дело в том, что в файле могли быть русские символы, а следующая проверка:
C++ (Qt)
1
if (s[i] == 'н')
не работает. Подскажите, как исправить проблему?

P.S. На всякий случай: мне надо никуда эти русские символы потом писать и т.д., только именно считать и распарсить из файла
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2014, 17:24
Ответы с готовыми решениями:

Обработка русских символов в Qt
Совсем недавно начал изучать Qt. Написал вот такую функцию, которая должна...

Отображение русских символов в проекте Qt Widgets
Всем доброго здравия. Напоролся на такую проблему. В приведенном в качестве...

Не работает регулярка для русских символов
Здравствуйте, есть два регулярных выражения. Для латинских символов всё...

Расшифровка MD5 не работает для русских символов
Код Отлично отрабатывает английский словарь, но Русские буквы пропускает!...

Кодирование кода ASCII в строку не работает для русских символов
У меня есть массив byte с кодами символов,мне нужно перекодировать его в...

9
schdub
Эксперт С++
3030 / 1374 / 419
Регистрация: 19.01.2009
Сообщений: 3,665
Завершенные тесты: 1
14.08.2014, 17:30 #2
One, какая кодировка файла откуда читаете? Какая кодировка исходного файла? Скорее всего они разные.
0
One
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 54
14.08.2014, 17:38  [ТС] #3
schdub,
Кодировка файла, откуда читаю, windows-1251.
Что вы имеете в виду под "исходным файлом"?
0
schdub
Эксперт С++
3030 / 1374 / 419
Регистрация: 19.01.2009
Сообщений: 3,665
Завершенные тесты: 1
14.08.2014, 17:44 #4
Цитата Сообщение от One Посмотреть сообщение
Что вы имеете в виду под "исходным файлом"?
Кодировка исходного .cpp файла, т.е. кодировка в редакторе исходного текста.
0
One
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 54
14.08.2014, 17:55  [ТС] #5
schdub, вроде UTF-8. Действительно, разные. Но пока не очень понял, как это связано и как исправить собственно...
0
RazrFalcon
1386 / 1243 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
14.08.2014, 18:39 #6
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
QFile f("Text File.txt");
f.open(QFile::ReadOnly);
QTextStream stream(&f);
stream.setCodec(QTextCodec::codecForName("Windows-1251"));
QString s = stream.readAll();
 
// или
//QByteArray arr = f.readAll();
//QTextCodec *c = QTextCodec::codecForName("Windows-1251");
//QString s = c->toUnicode(arr);
 
qDebug() << s;
0
schdub
Эксперт С++
3030 / 1374 / 419
Регистрация: 19.01.2009
Сообщений: 3,665
Завершенные тесты: 1
14.08.2014, 18:40 #7
One,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ...
    QByteArray d(file.readAll());
    qDebug() << d.toHex(); // d4fbe2e020eeebe4c6
    // допустим, d == "Фыва олдЖ" в Windows-1251 (8 - бит на символ)
 
    QString s1(d), s2(QTextCodec::codecForName("Windows-1251")->toUnicode(d));
    // s1 - преобразовано в QString без перекодирования
    // s2 - преобразовано с указанием исходной кодировки
 
    qDebug() << (s1[0] == 'Ф'); // false
    qDebug() << (s2[0] == 'Ф'); // false
 
    qDebug() << s1[0].unicode(); // 212 или 0xd4
    qDebug() << s2[0].unicode(); // 1060 или 0x0424
 
    qDebug() << (s1[0] == 0xd4);   // true
    qDebug() << (s2[0] == 0x0424); // true
// ...
0
One
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 54
14.08.2014, 19:05  [ТС] #8
RazrFalcon, теперь все отображается корректно, но условие почему-то все равно не выполняется...
То есть, если вывожу qDebug() << s[i], выводится 'н', а в условие не заходит...
0
RazrFalcon
1386 / 1243 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
14.08.2014, 19:15 #9
One, а что у вас за компилятор вообще, к примеру clang не дает собрать такой код:
C++ (Qt)
1
2
3
error: character too large for enclosing character literal type
qDebug() << (s.at(0) == 'ф');
                        ^
C++ (Qt)
1
qDebug() << (s.at(0) == QString::fromUtf8("ф").at(0)); // true
0
One
0 / 0 / 0
Регистрация: 04.07.2014
Сообщений: 54
14.08.2014, 19:17  [ТС] #10
RazrFalcon,
MinGW 4.8.2

Да, уже сам нашел решение в гугле
Чуть по-другому, но суть та же
if (s[i] == QString::fromLocal8Bit("н")[0])
0
14.08.2014, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2014, 19:17

Почему функция ucfirst не работает в кодировке utf-8 для русских символов
Помогите, пожалуйста. Почему функция ucfirst не работает в кодировке utf-8...

Почему функция strtolower не работает в кодировке utf-8 для русских символов
Помогите, пожалуйста. Почему функция strtolower не работает в кодировке utf-8...

Написать программу для замены русских символов в текстовом файле на "0"
Народ, помогите написать программу и метод который в указанном текстовом файле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru