LINUX.ORG.RU

В Qt с версии 5.5 по-тихому изменили работу qDebug()

 


1

3

Начиная с версии 5.5 на вот такой кусок кода:

qDebug() << QString("проверка кириллицы");

вам в консоль выведется

\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 043A\u0438\u0440\u0438\u043B\u043B\u0438\u0446\u044B

Разрабы утверждают что это intended behaviour. Я считаю что они сошли с ума.

Собственно мой багрепорт https://bugreports.qt.io/browse/QTBUG-47316

Кто-то сомневался, что Qt скатится после смерти Нокии?

anonymous ()

Я считаю что они сошли с ума

Обясни им про «Principle of least astonishment».

anonymous ()

Потому что проблемы третьего мира их не волнуют.

anonymous ()

А как было раньше? По-моему у qDebug всегда были проблемы с кириллицей.

grazor ()

Я считаю что они сошли с ума.

Просто англоговорящим тяжело понять что тут такого. Но я согласен, пойду отпишусь.

CrossFire ★★★★★ ()
Ответ на: комментарий от grazor

По-моему у qDebug всегда были проблемы с кириллицей.

Разве что на венде теоретически могли быть, сейчас сломали везде.

CrossFire ★★★★★ ()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Да, я очень расчитываю, что количество отписавшихся даст им понять какую чепуху они спороли. Пока что Thiago вообще не видит ничего плохого в том что он сделал.

zekses ()

Так вроде написано же в справке по qDebug() что строка должна быть Latin1

The format should be a Latin-1 string.

Собственно на маздае оно и не работало никогда, в Qt4 по крайней мере.

d_a ★★★★★ ()
Ответ на: комментарий от zekses

Ну значит починили теперь. Алсо, на винфак.

d_a ★★★★★ ()
qDebug() << "а вот так нормально выводит???";

Если нет, я буду жаловаться в межгалактическую ассоциацию! Но

QString("проверка кириллицы");
тоже требую чтобы работало!

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от d_a

А это побороть можно? Можно его заставить хавать UTF-8? Я помню что переопределял qDebug по-своему как-то...

I-Love-Microsoft ★★★★★ ()

Ребзя, а что значит это:

And despite all of this, if you want to ignore all the warnings and do what you're not supposed to, QDebug provides a way and has provided it since Qt 4.0. If you wanted no mangling, you should have considered noquote() already.

As for a notice, there was a clear one in the ChangeLog, in the section «Important Behavior Changes», which included the noquote() trick. You're expected to read the changelog, especially that section, when upgrading.

Это можно считать workaround-ом?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

На онтопике можно [было] выводить правильно после QTextCode::setLocaleFor... ("UTF-8"), но это скорее совпадение что работало, из-за того что терминал умный и слепляет обратно символы из байтиков.

Но это про Qt4. 5 я не смотрел, только справку прочитал, но там то же самое, то бишь Latin1 || GTFO.

d_a ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Очасти можно, но это всё равно мегаизвращение так как требует модификации всего существующего кода.

Плюс у них появляется функция которая выполняет не свою работу

zekses ()

Двоякое чувство. С одной стороны должно работать, но из практических соображений нахер оно надо?

anonymous ()
Ответ на: комментарий от I-Love-Microsoft

Это можно считать workaround-ом?

Можно придумать много костылей, однако каждый раз писать их — лишняя трата времени.

CrossFire ★★★★★ ()

Вы ещё функции с классами по-русски называйте [рукалитсо.жпг] Я считаю, что если нужно журналирование - используйте специальные библиотеки вроде https://github.com/gabime/spdlog

asaw ★★★★★ ()
Ответ на: комментарий от asaw

О да, давайте тогда вообще откажемся от фреймворков и будем использовать только «специализированные библиотеки»

zekses ()
Ответ на: комментарий от I-Love-Microsoft
qDebug() << "а вот так нормально выводит???";

Пока да.

ЛОЛ, до сих пор не пробовал выводить киррилицу через qDebug().

KennyMinigun ★★★★★ ()
Ответ на: комментарий от KennyMinigun

это далеко не всем нужно, но тем кому нужно кутишники этим изменением подгадили сильно

zekses ()
Ответ на: комментарий от KennyMinigun

ЛОЛ, до сих пор не пробовал выводить киррилицу через qDebug().

Оно работает только потому что локальная кодировка совпадает с кодировкой файла исходного кода (UTF-8?), что в общем случае работать не будет. Поэтому нелатинские символы в C/C++ это плохой тон, безотносительно завёрнуты ли они в QString или нет.

Dendy ★★★★★ ()
Ответ на: комментарий от anonymous

Qt скатится после смерти Нокии?

Nokia не умерла, а вот Qt похоже загибается.

robot12 ★★★★★ ()

Ну конвертни это кодеком к системной локали...

В какой у тебя кодировке сорцы?

В худшем случае, тебе ничто не мешает написать свой qDebug(), в смысле, что есть механизм, для подмены поведения сего поделия.

Поэтому в рамках нормального проекта исправить это 15минут*степень некомпетентности разработчика.

Зато у кучи крассавчегов, кому не надо писать в логи юникод, всё станет слегка пободрей.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

я не хочу заводить autoinclude хедер только ради переопределения одного макроса

zekses ()
Ответ на: комментарий от zekses

Ну не хочешь как хочешь.

А доку ты почитать не хочешь?

pon4ik ★★★★★ ()
Ответ на: комментарий от zekses

Например возьми и почитай доку про систему отладочного вывода Qt, и про текстовые кодеки, заодно, что бы два раз не ходить.

Заместо того, что бы людям на багтрекере голову морочать.

pon4ik ★★★★★ ()
Ответ на: комментарий от pon4ik

Мне кажется это вы пытаетесь мне что то доказать. Если хотите что-то сказать - говорите прямым текстом, а не отсылкой к абстрактным докам.

zekses ()
Ответ на: комментарий от KennyMinigun

Таже фигня, за всё время работы с Qt ни разу не понадобилось. Они выводят кириллицу через qDebug, Карл!

fluorite ★★★★★ ()
Последнее исправление: fluorite (всего исправлений: 1)
Ответ на: комментарий от asaw

Оно лучше чем log4c++? Я согласен что в серьезном софте такие нужны логгеры но для поделки хотелось бы qDebug чтобы кириллицу мог.

Жаль не могу щас 5.5 обновить через мопед, но noquote надо попробовать, отпишусь потом...

I-Love-Microsoft ★★★★★ ()

А если обернуть в tr()?

XMs ★★★★★ ()
Ответ на: комментарий от zekses

Лол я так и думал, что это Macieira. У этого Thiago ЧСВ пробивает все мысленные и немыслимые границы. Конечно, специалист он хороший, но чёрт возьми, ему бы скромности немного.

EXL ★★★★★ ()
Ответ на: комментарий от robot12

Nokia не умерла

Повторяйте эту мантру каждый день, может воскреснет, лол. Пока же я вижу телефоны с шильдиками Microsoft.

EXL ★★★★★ ()
Последнее исправление: EXL (всего исправлений: 1)

Обожемой, это ужас-ужас. Возмущению нет предела.

Зачем писать кириллицей в дебаг? Может у вас ещё и комментарии в коде на русском?

fenris ★★★★★ ()
Ответ на: комментарий от fenris

Да, я тоже не понимаю этого.

Но баг существует? Существует. Раньше работало? Работало. Так какого хера взяли и сломали, спрашивается?! Мало ли, может там кому нужно будет tr-строки таким способом подебажить ну и вообще.

EXL ★★★★★ ()
Ответ на: комментарий от fluorite

Таже фигня, за всё время работы с Qt ни разу не понадобилось. Они выводят кириллицу через qDebug, Карл!

Предположим есть у нас какой-нибудь сложный продукт с кучей взаимосвязанных полей, combobox'ов, списков и т.д., который работает с БД. Эта БД может приходить от пользователя, у которого, внезапно, там будет кириллица. Работает у него что-то некорректно, он и скидывает базу разработчикам. Для отладки мне нужно выводить поля получившихся объектов, состояния контролов после каждого действия, содержимое выбранной строки списка и т.д.

CrossFire ★★★★★ ()
Ответ на: комментарий от EXL

Конечно, специалист он хороший

Да никакой он специалист. По «качеству» Qt очень заметно. Сломали всё что только можно.

anonymous ()

Странно, что никто не вспомнил про qInstallMsgHandler.

Так шо 15 минут на исправление с головой, можно даже успеть чайку выпить!

AF ★★★ ()
Ответ на: комментарий от EXL

Вот так пока ещё работает

qDebug(«%s», qPrintable(tr(«русский текст»)));

А так молодцы, чё. Русский названия испытаний из лога теперь фиг достанешь.

anonymous ()
Ответ на: комментарий от CrossFire
qDebug() << "раз" << qPrintable("два") << qPrintable(QString("три")) << QString("четыре") << QString("пять").toStdString().c_str();
раз два три "\u0447\u0435\u0442\u044B\u0440\u0435" пять
fluorite ★★★★★ ()

Начиная с версии 5.5 на вот такой кусок кода:
qDebug() << QString( «проверка кириллицы» );
вам в консоль выведется
\u043F\u0440\u043E

Почему setCodecForLocale не показываешь, или ты с Qt4 сразу на 5.5 пересел?

normann ★★ ()
Ответ на: комментарий от anonymous

setCodecForLocale

А это ещё зачем?

В пятёре qDebug работает через setCodecForLocale. Еще, в Qt5 все исходники должны быть в utf8, это обязательное условие, иначе обработка строковых литералов не сработает.

normann ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.