Russian Qt Forum

Qt => Общие вопросы => Тема начата: Yuriy от Сентябрь 15, 2011, 15:53



Название: QString::simplified и русская буква Р
Отправлено: Yuriy от Сентябрь 15, 2011, 15:53
Всем привет! Долго искал ошибку в своей разработке и менял локали, пока не нашел в чем проблема (независимо от платформы)
Вот простой пример:

Код:
    const char* aValue = "Разные тесты с буквой Р";
    QString aStr(aValue);
    qDebug() << QString::fromUtf8(aStr.toAscii());
    aStr = aStr.simplified();
    qDebug() << QString::fromUtf8(aStr.toAscii());

При этом вместо строки "Разные тесты с буквой Р" мы получим:
 "? азные тесты с буквой ?"

И другой тест:
Код:
    QString aStr = QString::fromUtf8("Разные тесты с буквой Р");
    qDebug() << aStr;
    aStr = aStr.simplified();
    qDebug() << aStr;
Во втором примере все отлично работает.
В чем же дело ??? В кодировке ASCII некорректно обрабатывается буква Р? QString думает что это \т\е\а\а и т.д. ?


Название: Re: QString::simplified и русская буква Р
Отправлено: GreatSnake от Сентябрь 15, 2011, 15:58
Какой установлен QTextCodec::codecForCStrings()?


Название: Re: QString::simplified и русская буква Р
Отправлено: kambala от Сентябрь 15, 2011, 16:01
укажи кодировку для русских букв, например QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));


Название: Re: QString::simplified и русская буква Р
Отправлено: Yuriy от Сентябрь 15, 2011, 21:01
Не реагирует он на кодеки. Самопальную функцию описал для удаления лишних пробелов и прочего из строки.

Вообще, есть такие моменты с поддержкой русского языка. Так например, все функции QTScript связанные со строками не работают для русских букв, неправильное определение ширины некоторых русских букв QFontMetrics, точно знаю, таких как т, ж, р.

Да и черт с ним, не писать же в баг репорт Qt по этому поводу ?


Название: Re: QString::simplified и русская буква Р
Отправлено: LisandreL от Сентябрь 15, 2011, 21:08
Да и черт с ним, не писать же в баг репорт Qt по этому поводу?
Вообще-то, когда вы находите ошибку (и она действительно в фреймворке, а не в вашем коде), то написать баг репорт - самая логичная и правильная вещь.


Название: Re: QString::simplified и русская буква Р
Отправлено: kambala от Сентябрь 15, 2011, 21:47
в какой кодировке файл исходного кода?

у меня этот тестовый пример с QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); работает правильно (потому что исходник в UTF-8), без кодека - проблема проявляется


Название: Re: QString::simplified и русская буква Р
Отправлено: Yuriy от Сентябрь 15, 2011, 23:57
А и вправду. А как это использовать ? QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); можно поместить в main.cpp или нужно при каждом вызове QString запускать.

Я честно говоря, по другой теме, вообще колосальное открытие для себя сегодня совершил, если кому интересно, расскажу  ;D и поэтому уже не парюсь по поводу simplified()


Название: Re: QString::simplified и русская буква Р
Отправлено: kambala от Сентябрь 16, 2011, 01:15
А и вправду. А как это использовать ? QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); можно поместить в main.cpp или нужно при каждом вызове QString запускать.
в мэин


Название: Re: QString::simplified и русская буква Р
Отправлено: thechicho от Сентябрь 30, 2011, 17:03
Yuriy,
расскажи


Название: Re: QString::simplified и русская буква Р
Отправлено: Yuriy от Сентябрь 30, 2011, 23:49
Рассказываю:
на тот момент времени я узнал, что strlen() съедает много процессорного времени при использовании в цикле, например,
если даже создать пустой цикл, типа

Код:
char myValue[1024]; //Какая-то строка
for(int i = 0; i < strlen(myValue);++i)
{
}

это вызовет тормоза, хотя ничего не происходит на самом деле.

Решение очень простое:
Код:
int someLength = strlen(myValue);
for(int i = 0; i < someLength;++i)
{
}

Соответственно во втором случае никаких тормозов нет


Название: Re: QString::simplified и русская буква Р
Отправлено: andrew.k от Октябрь 01, 2011, 00:59
Сотни благодарных программистов сказали тебе спасибо, Кэп :)


Название: Re: QString::simplified и русская буква Р
Отправлено: Yuriy от Октябрь 01, 2011, 01:13
Кэп? Понятно что такая элементарщина вызывает смех да и только. Но на самом деле из-за такой мелочи при работе с большим кол-вом строк виснет GUI  и на долго.

Много разных экспериментов со строками. Не обязательно использовать QString, гораздо быстрее std::string, а еще экономичнее и быстрее char. В разы быстрее работает strcmp, чем == для QString и т.д.


Название: Re: QString::simplified и русская буква Р
Отправлено: andrew.k от Октябрь 01, 2011, 01:21
Дело тут не в кустрингах совершенно.
Просто не нужно в цикле делать вызов функции, которая всегда возвращает одно и то же значение.
Особенно функцию strlen.

//for ( int i = 0; i < list.count(); ++i) //Плохо
int count = list.count();
for ( int i=0; i< count;++i) //хорошо
   doIt();



Название: Re: QString::simplified и русская буква Р
Отправлено: kambala от Октябрь 01, 2011, 02:14
разве нормальные компиляторы не оптимизируют подобные вещи? я понимаю, что даже если и да, это все равно не повод экономить на одной строчке.


Название: Re: QString::simplified и русская буква Р
Отправлено: Странник от Октябрь 01, 2011, 11:29
разве нормальные компиляторы не оптимизируют подобные вещи? я понимаю, что даже если и да, это все равно не повод экономить на одной строчке.
компилятор не оптимизирует подобные вещи - мало ли что вы делаете в цикле с элементами списка, нет гарантии, что каждый вызов list.count() будет возвращать одно и то же значение.


Название: Re: QString::simplified и русская буква Р
Отправлено: andrew.k от Октябрь 01, 2011, 13:13
ну понятно, что если список используется только для чтения.