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 ☆☆☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.