LINUX.ORG.RU

Qt5 fromUnicode()

 


0

2

Речь о Qt5.4.1 Вот такой фрагмент кода:

QtextEncoder* cp866 = QtectCodec::codecForName("cp866")->makeEncoder();
qDebug() << cp866->fromUnicode("Се буквы Земли Руссссцкой\n");
qDebug() << QTextCodec::codecForName("cp866")->fromUnicode("Се буевы Земли Руссссцкой\n");
Выводят только вопросительные знаки на месте кирилических символов. Я так вообще буквы ожидал увидеть, может я че неправильно делаю, или это баг Qt?

P.S. Правда все это под оффтопиком, но ведь не суть важно?

★★

Се буквы Земли Руссссцкой
Выводят только вопросительные знаки на месте кирилических символов.

Qt уважает наш язык.

erfea ★★★★★
()

А консоль в которую выводишь в cp866? А шрифт в эту мамонтову кодировку может?

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

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

normann ★★
() автор топика
    auto data = QTextCodec::codecForName("cp866")->fromUnicode("Привет");
    QFile f("test.txt");
    f.open(QIODevice::WriteOnly);
    f.write(data);
    f.close();

Записывает файл в кодировке cp866. Тебе важно убедиться, что исходник в utf-8 (в qt5 она идет по умолчанию для cstrings). Если же у тебя цель распечатать в консоль, лучше настроить локаль, т.к. игры с кодировками приведут к разным результатам в разных окружениях.

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

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

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

В utf8, конечно.

А ты уверен, что компилятор их не преобразует к чему либо другому? VS любит делать cp1251 из utf8, например.

Попробуй

#if defined(WINVER) || defined(WIN32)
    if (QLocale::system().country() == QLocale::RussianFederation)
        QTextCodec::setCodecForLocale(QTextCodec::codecForName("IBM866"));
#endif

    QString s = QObject::trUtf8("Привет мир!!!");

    qDebug() << s;

Но ещё раз БОЛЬШАЯ рекомендация. Не используй не ANSI строки в коде. Для решения головных болей есть механизмы интернационализации tr.

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

Русские строки в исходниках?

При чем здесь вообще исходники? Прочитай заголовок треда.

Тебя не смущает, что qDebug начинается с q, а значит предполагает работу с QString, а не с байтами?

Ну вообще-нет:
http://doc.qt.io/qt-5/qdebug.html#operator-lt-lt-14
http://doc.qt.io/qt-5/qdebug.html#operator-lt-lt-18
И даже
http://doc.qt.io/qt-5/qstring.html#QString-8
http://doc.qt.io/qt-5/qstring.html#QString-9

http://doc.qt.io/qt-5/qtextcodec.html#setCodecForLocale ?

Это как раз и сработало, только в доках об этом ничего нету (о том что QDebug поумолчанию пропускает через codecForLocale).

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

Уверен, я пользуюсь нормальными компиляторами.

Ужеж написал что вариант с локалью сработал, с setCodecForLocale QDebug все четко показывает переводя юникодовые строки самостоятельно.

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

файл в котором все это лежит не UTF-8. cp866 - это кодировка виндового терминала по умолчанию.

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

Правильное решение - использовать qPrintable()

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

Где-то в документации Qt5 сказано, что qDebug ожидает юникод, быстро найти не получается.

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

0_о на счет консоли хз... но в винде вроде как давно уже даже не cp1251, а UTF-16 во все поля. cp866 вроде как вообще досовская кодировка.

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

Пользуйся gettext'ом и проблем не будет. У меня вот все тексты в КОИ8, однако геттекст благополучно их в хрюникод при надобности транслирует.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от RiseOfDeath

Есть такая штука, называется обратная совместимость, от нее никуда не убежишь, даже майкрософт не убежала.

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

Люди с яйцами решают эту проблему быстро и эффективно. Посмотри на python2 и python3, например. А девки сюсюкаются с легаси.

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