qDebug() не поддерживает строки Unicode в Windows

У меня есть редактирование строки, которое содержит имя файла с символами Unicode, и оно правильно отображается в графическом интерфейсе, но когда я печатаю его с помощью qDebug(), оно показывает символы Unicode в виде вопросительных знаков.

Например, для "C:/Test/абв" этот код покажет только "C:/Test/???".

Эта строка:

qDebug() << ui->lineEditFileName->text();

Покажет:

введите здесь описание изображения

Эта проблема возникает только в Windows (и XP, и 7), в Linux все работает нормально. Версия Qt 4.8.0.


person sashoalm    schedule 02.06.2013    source источник


Ответы (4)


Также проверьте этот параметр «Регион и язык» -> «Программы, не поддерживающие Unicode» в Панели управления. Это помогло мне исправить неправильные символы в консоли отладки.

экран

person XandrGuard    schedule 10.11.2016
comment
Это работает и в Windows 10, только диалоговое окно настроек для программ, не поддерживающих Юникод, немного более скрыто. - person Andrej Repiský; 18.10.2017

Кажется, что текст Unicode «потерян при переводе», потому что Qt Creator использует QString::fromLocal8Bit() при чтении вывода отладки из процесса.

Я нашел ответ в этой теме:

Я не знаю, что использует qDebug для вывода строк на консоль в Windows (я предполагаю, что это QString::toLocal8Bit). Я знаю, что Qt Creator использует QString::fromLocal8Bit(…) для чтения текста из процесса. Это отлично работает везде… но, к сожалению, есть одна ОС, которая по-прежнему настаивает на использовании кодовых страниц, полностью разрушающих любую попытку отобразить более одного типа скрипта в одном типе.

person sashoalm    schedule 19.07.2013
comment
т.е. вместо того, чтобы делать правильные вещи внутри (преобразование в / из UTF-8) или нативную вещь (которая была бы UTF-16 в Windows), Qt вместо этого использует локальную 8-битную кодировку и разбивает текст Unicode? Не могу винить в этом Windows, есть два разумных способа сделать это, и Qt не выбирает ни один из них. - person MSalters; 19.07.2013
comment
Я согласен, не было причин выбирать/изLocal8Bit, когда они контролируют оба конца и знают, что оба поддерживают UTF8. - person sashoalm; 19.07.2013

Где найти настройку, описанную @XandrGuard в Windows 10: Язык -> Настройки административного языка -> изменить языковой стандарт системы -> проверить бета-версию: использовать unicode utf-8. (требуется перезагрузка) введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person benk    schedule 25.06.2019

Linux использует Unicode для своего терминала, Windows - нет. Вы можете узнать, какая кодовая страница используется, набрав chcp в cmd. Что вам нужно, так это преобразовать вашу строку, используя эту кодовую страницу перед ее выводом:

QTextCodec *codec = QTextCodec::codecForName("CP866");
qDebug() << codec->fromUnicode(ui->lineEditFileName->text());

Или установите его для всех c-строк:

int main()
{
    ...
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("CP866"));
    ...
}

Второй фрагмент кода сделает "CP866" кодеком по умолчанию для всех строк в вашей программе.

person Amartel    schedule 02.06.2013
comment
qDebug() в моем случае выводит на панель вывода приложения Qt Creator, а не в cmd, потому что мое приложение не является консольным приложением. - person sashoalm; 02.06.2013
comment
Application Output использует Utf-8. Вы используете другой текстовый кодек? - person Amartel; 02.06.2013
comment
Нет, не пользуюсь, это происходит на только что созданном проекте, где у меня просто редактирование строки и кнопка, и я делаю qDebug() << ui->lineEdit->text(); в слоте кнопки. Если строка в строке редактирования имеет кодировку Unicode, она отображается в виде вопросительных знаков в выходных данных приложения. - person sashoalm; 18.07.2013
comment
Windows полностью использует Unicode для своего терминала. Возможно, вы не выбрали терминальный шрифт с достаточным количеством глифов, но такая же ошибка возможна в Linux. Просто подумайте: какой смысл в WriteConsoleW? Та же проблема со шрифтами может существовать в Qt Creator. Какой шрифт используется для панели вывода? - person MSalters; 19.07.2013
comment
Так вы имеете в виду, что проблема может быть в шрифте? Но я не могу понять, какой шрифт для панели, есть только одна настройка шрифта, и она для самого текстового редактора, его изменение не влияет на панель вывода приложения. - person sashoalm; 19.07.2013
comment
Я только что попытался вставить текст Unicode в панель вывода приложения (на самом деле вы можете редактировать внутри панели), и он отображается нормально. Только при печати через qDebug() становится вопросительным знаком. Если проблема была со шрифтом, я предполагаю, что вставленный текст/текст, введенный вручную, также будет отображаться как вопросительные знаки? - person sashoalm; 19.07.2013
comment
ИМХО, qDebug не работает. Вывод консоли должен использовать WriteConsoleW в Windows. Установка шрифта может быть выполнена, например. Qt Creator внутри. Черт возьми, даже некоторые установщики просят изменить шрифт консоли по умолчанию на что-нибудь полезное. - person rubenvb; 19.07.2013
comment
@sashoalm: если при вводе на панели отображается Unicode, шрифт в порядке. - person MSalters; 19.07.2013