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
ну понятно, что если список используется только для чтения.