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


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

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

Автор треда неверно описал проблему. Дело не в кирилице в исходном коде, а в переопределённом операторе qDebug() << QString. Неважно откуда взялась эта строка, теперь при попытке залогировать её содержимое будут выводиться коды юникода вместо текста.

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

У этого Thiago ЧСВ пробивает все мысленные и немыслимые границы.

Сейчас он в багтрекере объясняет, что логировать через qDebug нельзя было никогда. Мол эта функция исключительно для отладочных сообщений, которые нужно не читать, а отправлять разработчику, который должен будет пропустить сей выхлоп через декодер. А все кто логировал делали это неправильно и должны исправить все qDebug() на qDebug().noquote(), которую добавили в 5.5. Интересно что он ответит на вопрос как теперь сохранить совместимость исходного кода между 5.5 и предыдущими версиями, в которых небыло noquote.

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

В пятёре qDebug работает через setCodecForLocale.

Это где такое? УМВР без всяких костылей. Да и в доках написано, что только для «some applications that want to use their own mechanism for setting the local»

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

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

В хендлер попадает уже сконвертированная строка с кракозябрами. Да-да, это не баг, так и задумано.

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

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

В том и дело, что начиная с 5.5 они игнорируют codecForLocale и всегда выводят закодированную строку.

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

Каковы пути обхода этой проблемы?

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

I've conceded that it makes reading of non-English text more difficult. Sorry, you can't win all cases. I'm saying that this is a positive trade-off.

Просто more difficult. А так positive trade-off.

Dendy ★★★★★
()

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

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

я не спец в Qt, но вижу, что это юникод

В том и дело, что это уже не юникод, а коды юникода в ASCII вперемешку с остальным форматированием. Другими словами, обратной декодировке в общем случае не подлежит.

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

Мда... А лог тогда для чего?

Согласно Тьяго, есть лог, а есть отладочный лог. И он настоятельно просит не путать эти две кардинально разные сущности. В отладочный лог должен попадать нечитабельный мусор, отсылаемый разработчику для дальнейшего анализа. А неотладочного лога в Qt никогда и небыло (-: Deal with it.

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

А сломал там всё, как обычно, Kai Köhne? Чей коммит внёс такое поведение?

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

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

А в камментах там знатно бомбануло. Не представляю, зачем выводить кирилицу черзе qDebug, ещё бы на иероглифы пожаловались..

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

Это где такое? УМВР без всяких костылей.

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

Во вторых, это не костыли а фича для тех кто не хочет нагромрждать код перекодировки на каждом месте вывода отладочных.

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

ИМХО конечно но Thiago абсолютно прав. Кто логировал через qDebug тот ССЗБ. Для логов есть файлы или даже целые библиотеки. Это лишь qDebug это лишь отладочная инфа(что из названия следует) для выплевывания в консольку.

как теперь сохранить совместимость исходного кода между 5.5 и предыдущими версиями

ССЗБ же, страдай если используешь функции не по назначению.

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

Не представляю, зачем выводить кирилицу черзе qDebug

К примеру залогировать путь к файлу. Или имя/фамилию. Да любой читабельный текст полученный откуда угодно.

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

Доки, вполне себе конкретные. Если бы ты их прочитал, ты не лепил бы что то вроде

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

А уже давно решил бы проблемму. А если я кину тебе ссылку, то ты о5 пойдёшь плакать на лор и мозг есть разрабам, вместо прочтения доки (я не говорю уж про сорцы).

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

Так они с тем же успехом могли пропустить содержимое строки через zlib+base64. А на вопрос что с этим выхлопом делать ответ был бы:

ССЗБ же, страдай если используешь функции не по назначению.

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

К примеру залогировать путь к файлу.

/0

Или имя/фамилию. Да любой читабельный текст полученный откуда угодно.

Могу согласиться, но это правда не настолько частый use case.

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

Могу согласиться, но это правда не настолько частый use case.

Логировать текст не настолько частый use case? Или вы у себя исключительно названия переменных логируете?

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

Я больше использую что-то типа «Before..», «After..» и т.п. Если мне нужен именно текст, то отладки достаточно.

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

qPrintable - не костыль, а правильный метод конвертации для вывода на консоль. Предлагающие всякие другие костыли все упоролись.

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

думаю, надо поковыряться с настройками кодировки, которую Qt использует по умолчанию, и с настройками консоли. ну и код, естессна, должен быть в юникоде.
как вариант, можно скормить этот выхлоп какому-нить скрипту, который его переведёт в читабельный вид. echo -en умеет такое печатать. правда, там ещё и пробелы и местами \u отсутствует, так что придётся повозиться.

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

В данный момент у меня именно такой проект, как раз на qt. qDebug максимум должен указать почему все плохо и где, а не выплевывать значения переменных\ячеек. Если нужно смотреть переменные есть стандартные средства отладки IDE.

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

Тебя не туда занесло. Тут смысл в том, что раньше QString'и через qDebug() << QString(«_»); отображались нормально, а сейчас всё сломали. В итоге в куче софта, где использовали подобное, вместо читабельных сообщений в консоль будет выплёвывать нечто несуразное, вроде «\u0447\u0435\u0442\u044B\u0440\u0435».

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

qDebug максимум должен указать почему все плохо и где, а не выплевывать значения переменных\ячеек.

Да что ты говоришь! А я вот открываю документацию и вижу:

    qDebug() << "Date:" << QDate::currentDate();
    qDebug() << "Types:" << QString("String") << QChar('x') << QRect(0, 10, 50, 40);
    qDebug() << "Custom coordinate type:" << coordinate;

http://doc.qt.io/qt-5/qdebug.html#details

qDebug() << "Widget" << widget << "at position" << widget->pos();

http://doc.qt.io/qt-5/debug.html#warning-and-debugging-messages

И даже вот: http://doc.qt.io/qt-5/qtglobal.html#qDebug

EXL ★★★★★
()

Почитал.

Тьяго прав, чо.

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

У меня нет возможности сейчас проверить что они накрутили там в Qt 5.5

Я правильно понял, что qDebug() << QString("текст"); и qDebug() << QString("text"); будут выдавать внутреннее представление QString в Unicode-Escape последовательностях? Или же только в том случае, где использована кириллица?

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

и останется единое и универсальное жирное представление

fxd

И это не юникод, это экранированный юникод. Видимо, как раз для неюникодных консолей и сделали, потому что если выплюнуть туда юникод как есть — будут кракозябры.

MiniRoboDancer ★☆
()

тоже на это напоролся ) но решил легко т.к. логировала единая функция - там добавил qPrintable но остались моменты, где qt сам выводит в qDebug - например об ошибке argument missing для arg в qstring считаю, что разработчики неверно поступили пойду почитаю багрепорт

еще момент - qInstallMessageHandler получает уже кореженный qstring

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

qPrintable - не костыль, а правильный метод конвертации для вывода на консоль.

Ага, а на выходе char *. Убивать за такое надо.

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

А что должно быть на выходе? Чтобы учесть потребности людей, предки которых решили напридумывать сотни тысяч иероглифов, придется использовать четырехбайтные символы, а это уже ни в какие ворота. А за char* вполне может скрываться строка в UTF-8.

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

А всяких смайликов с кучей оттенков кожи?

EXL ★★★★★
()

интересный они там аргумент приводят: qdebug это вывод для разработчик, а не для лога )
если мне пришлют (как разработчику) такой «удобный» вывод от qdebug - я наверно не буду этому рад )
еще идиотский аргумент - видеть не содержимое строки, а байты - никогда не требовалось видеть в qstring нечто иное чем ее содержимое
жаль мне того Thiago Macieira - много он о себе узнает нового )

x905 ★★★★★
()

А, собственно, зачем в отладочный лог писать кириллицу?

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

жаль мне того Thiago Macieira - много он о себе узнает нового )

Сломал-то, наверняка, Kai Köhne. Он любит хотфиксы в мастер засылать без проверки. Вот его недавнее творчество с шрифтами на GNU/Linux:

Было: http://lists.qt-project.org/pipermail/qt-creator/attachments/20150522/f03f25e...

Стало: http://lists.qt-project.org/pipermail/qt-creator/attachments/20150522/f03f25e...

Он на OS X сидит, вот и не заметил, что «рендеринг шрифтов OS X в ветку Linux закоммитил».

Я вообще не понимаю, у них есть тестеры или нет?

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

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

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

Я вообще не понимаю, у них есть тестеры или нет?

со шрифтами они не оттестили, да
но тут то поломали сознательно и это печалит
потом скажут что qdebug вообще для них самих только, а в документацию забыли это написать )

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

В документации оно у них как раз предназначено для вывода всяких переменных. Я выше кидал ссылки :)

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

не, я имею ввиду что они меняют внутри чтото, а потом задним числом говорят, что «документация неверна» и qdebug так нельзя было )

конечно я не согласен с этой поломкой

x905 ★★★★★
()

Ребят, ну вы флудеры, ответьте предложите workaround означенной проблемы. Я тупо хочу выводить через qDebug строки с кириллицей. Каков путь решения? Огорчен что это меняется в Qt 5.5.

Кто-нибудь попробуйте noquote из ссылки ТС-а в начале темы. У меня нет возможности проверить, через мопед сижу...

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

noquote работает, проверено. Просто это неудобно и получается бред когда функция используется совсем не для того чего задекларирована

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

я бы понял если бы она называлась noescape, но noquote то зачем делать функций двойного назначения?

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