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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QString::simplified и русская буква Р  (Прочитано 9989 раз)
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 думает что это \т\е\а\а и т.д. ?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 15, 2011, 15:58 »

Какой установлен QTextCodec::codecForCStrings()?
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #2 : Сентябрь 15, 2011, 16:01 »

укажи кодировку для русских букв, например QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Yuriy
Гость
« Ответ #3 : Сентябрь 15, 2011, 21:01 »

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

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

Да и черт с ним, не писать же в баг репорт Qt по этому поводу ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Сентябрь 15, 2011, 21:08 »

Да и черт с ним, не писать же в баг репорт Qt по этому поводу?
Вообще-то, когда вы находите ошибку (и она действительно в фреймворке, а не в вашем коде), то написать баг репорт - самая логичная и правильная вещь.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #5 : Сентябрь 15, 2011, 21:47 »

в какой кодировке файл исходного кода?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Yuriy
Гость
« Ответ #6 : Сентябрь 15, 2011, 23:57 »

А и вправду. А как это использовать ? QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); можно поместить в main.cpp или нужно при каждом вызове QString запускать.

Я честно говоря, по другой теме, вообще колосальное открытие для себя сегодня совершил, если кому интересно, расскажу  Смеющийся и поэтому уже не парюсь по поводу simplified()
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #7 : Сентябрь 16, 2011, 01:15 »

А и вправду. А как это использовать ? QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); можно поместить в main.cpp или нужно при каждом вызове QString запускать.
в мэин
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
thechicho
Гость
« Ответ #8 : Сентябрь 30, 2011, 17:03 »

Yuriy,
расскажи
Записан
Yuriy
Гость
« Ответ #9 : Сентябрь 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)
{
}

Соответственно во втором случае никаких тормозов нет
Записан
andrew.k
Гость
« Ответ #10 : Октябрь 01, 2011, 00:59 »

Сотни благодарных программистов сказали тебе спасибо, Кэп Улыбающийся
Записан
Yuriy
Гость
« Ответ #11 : Октябрь 01, 2011, 01:13 »

Кэп? Понятно что такая элементарщина вызывает смех да и только. Но на самом деле из-за такой мелочи при работе с большим кол-вом строк виснет GUI  и на долго.

Много разных экспериментов со строками. Не обязательно использовать QString, гораздо быстрее std::string, а еще экономичнее и быстрее char. В разы быстрее работает strcmp, чем == для QString и т.д.
Записан
andrew.k
Гость
« Ответ #12 : Октябрь 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();

Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #13 : Октябрь 01, 2011, 02:14 »

разве нормальные компиляторы не оптимизируют подобные вещи? я понимаю, что даже если и да, это все равно не повод экономить на одной строчке.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Странник
Гость
« Ответ #14 : Октябрь 01, 2011, 11:29 »

разве нормальные компиляторы не оптимизируют подобные вещи? я понимаю, что даже если и да, это все равно не повод экономить на одной строчке.
компилятор не оптимизирует подобные вещи - мало ли что вы делаете в цикле с элементами списка, нет гарантии, что каждый вызов list.count() будет возвращать одно и то же значение.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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