WedX - журнал о программировании и компьютерных науках

приложение qt показывает китайский язык в грязном коде в окнах при использовании формата кодировки UTF-8

Я разработал простое приложение qt для Windows, чтобы протестировать китайский формат кодировки qt UTF-8:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:");
    qDebug() << strMessage;
    return a.exec();
}

и мой формат кодировки файла main.cpp — UTF-8 без спецификации, но когда я запускаю приложение в Windows, строка печати приложения — «鎴戞槸UTF8缂栫爜鐨勬枃浠讹細», что, как я ожидаю, будет «我 是UTF8编码的文件:, кажется, что строка «我是UTF8编码的文件:» преобразована в формат кодировки GB2312, поэтому во время выполнения отображается неправильная строка «鎴戞槸UTF8缂栫爜鐨勬枃浠讹細» , и строка "我是UTF8编码的文件:" показывает правильную строку "我是UTF8编码的文件:'', когда приложение работает на macos, я не знаю почему? как разрешить строку "我是UTF8编码 的文件:" показывать прямо на платформе Windows, большое спасибо!


  • Проблема в том, что Linux (и другие производные UNIX, такие как macOS, BSD и т. д.) используют Unicode для своего терминала, а Windows — нет. Консоль Windows не может печатать Unicode. Вы можете попробовать установить кодовую страницу консоли Windows на кодовую страницу 65001 и использовать шрифт Lucida Console для консольного терминала. 13.05.2019

Ответы:


1

В Windows вывод UTF-8 на консоль не выполняется автоматически. Вам нужно сначала выполнить эту команду в консоли, чтобы перейти на кодовую страницу 65001 (которая является кодовой страницей UTF-8 Windows):

chcp 65001

Вам также необходимо установить шрифт, который предлагает китайские символы. В Windows 10 это шрифт «NSimSun». Тем не менее, консоль Windows имеет удобную функцию, которая автоматически переключает шрифт, если вы устанавливаете китайскую кодовую страницу (например, 936). Таким образом, вы можете программно запускать эти команды, используя стандартную библиотечную функцию system(). Однако команда chcp производит вывод. Чтобы скрыть его, перенаправьте вывод на nul.

#include <cstdlib>

// ...

int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
    // Temporary codepage change so we get an automatic font change.
    system("chcp 936 > nul");
    // Change to UTF-8.
    system("chcp 65001 > nul");
#endif

    QApplication a(argc, argv);
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    QString strMessage = QString::fromUtf8("我是UTF8编码的文件:");
    qDebug() << strMessage;
    return a.exec();
}

(Кроме того, вы должны использовать QString::fromUtf8(), так как вы знаете, что текст в UTF-8.)

13.05.2019
  • QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030")); мне подходит. 17.12.2019
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]