crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> плавающий баг вывода utf8 на stdout
lrx2
  опции профиля:
сообщение 24.2.2017, 0:07
Сообщение #11


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 7.12.2011
Пользователь №: 3050

Спасибо сказали: 0 раз(а)




Репутация:   0  


из setlocale завершаются нормально только:
setlocale(LC_ALL, 0) - возвращает "c", т.е. что установлена минимальная си-локаль.
setlocale(LC_ALL, "") - возвращает "cp1251".
Сдаюсь. Раз уж даже setlocale тупо не может установить локаль cp65001(возращает NULL), то и черт с ним.
Спасибо за потраченное время.

Итоговое (мож кому пригодится):
#include <QCoreApplication>
#include <QTextCodec>
#include <iostream>
#include <QDebug>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //Источники:
        //http://blog.kislenko.net/show.php?id=1459
        //http://local.joelonsoftware.com/wiki/%D0%90%D0%B1%D1%81%D0%BE%D0%BB%D1%8E%D1%82%D0%BD%D1%8B%D0%B9_%D0%9C%D0%B8%D0%BD%D0%B8%D0%BC%D1%83%D0%BC,_%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D1%8B%D0%B9_%D0%9A%D0%B0%D0%B6%D0%B4%D1%8B%D0%B9_%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA_%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%9E%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE_%D0%94%D0%BE%D0%BB%D0%B6%D0%B5%D0%BD_%D0%97%D0%BD%D0%B0%D1%82%D1%8C_%D0%BE_Unicode_%D0%B8_%D0%9D%D0%B0%D0%B1%D0%BE%D1%80%D0%B0%D1%85_%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2
        //http://www.unn.ru/pages/e-library/vestnik/99999999_West_2011_3%282%29/47.pdf

    //текущий пример идет с учетом, что кодировка файла с исходным кодом UTF-8


    //все примеры собраны в одну функцию для компактности
    //если запускать все подряд, как есть, то результат не будет желаемым
    //т.е. до запуска и проб необходимо выбрать один вариант, а все остальные закомментировать


    //------------------------- 0 setlocale
    //чтобы остальные примеры работали нормально..
   // wcout<<"locale: " <<setlocale(LC_ALL,"")<<endl;//..<--эту строку неоьбходимо закомментировать
        //setlocale возвращает строку с именем локали
        //при неудаче вернет NULL
        //setlocale предоставляет преобразование строк только для вывода на консоль, но не для чтения с неё
        //подробнее http://www.unn.ru/pages/e-library/vestnik/99999999_West_2011_3%282%29/47.pdf
            //ЛОКАЛИЗАЦИЯ КОНСОЛЬНЫХ ПРИЛОЖЕНИЙ В ЯЗЫКЕ C++
            //© 2011 г. В.Л. Тарасов
            //Информационные технологии
            //Вестник Нижегородского университета им. Н.И. Лобачевского, 2011, № 3(2), с. 301–307
    wcout<<L"Привет, мир!"<<endl;


    //------------------------ 1 QTextCodec::setCodecForLocale -----------------------
    cout<<"\n\n----ver1 -----\n";
    QTextCodec *coding = QTextCodec::codecForName("866");
    QTextCodec::setCodecForLocale(coding);
    system("chcp 866"); //просто убедиться, что стоит кодировка 866 -- будет работать только в винде

    qDebug() << "qDebug(): русский текст -- ok";
    qWarning() << "qWarning(): русский текст -- ok";
    cout<<"cout: [русский текст] -- not ok\n";


    //------------------------- 2 QTextStream(std)+QTextCodec ----------------------
    cout<<"\n\n----ver2 -----\n";
    QTextStream co(stdout);

    co.setCodec(coding);
    co<<"new codec for locale: [" << QTextCodec::codecForLocale()->name() <<"]";
    co.flush();

    co<<QString::fromUtf8("\nver2: fromUtf8: [русский текст] -- ok\n");
    //с учетом, что кодировка файла должна быть utf-8,
    //да и с 2012 года по умолчанию считается таковой,
    //то можно сделать и просто:
    co<<QString("\nver2: QString(): [русский текст] -- ok\n");
    //QString строки внутри себя хранит в кодировке UTF16, который уже переводится в любую необходимую кодировку
    co<<"ver2: simple: [русский текст] -- not ok \n";
    co.flush();

        //------------ чтение-запись ------------

    co.setCodec("CP866");
    co<<QString("Введите ваше имя: ");
    co.flush();


    QTextStream ci(stdin);
    ci.setCodec("CP866");
    QString name;
    ci >> name;
    co << QString("Привет, ") <<
            name    <<
            "!"     << endl;


    //---------------------- 3 chcp 65001
    system("chcp 65001 > text"); // для utf-8, для преобразованного в юникод текста
        //+придется в свойствах консоли сменить шрифт на Lucide
        //system("chcp 1251"); // для cp1251, при это не надо преобразовывать выводимый текст в юникод
        //работает только для windows
        //не работает стабильно -- выводится только первая строка
            //после чего ни на что не реагирует и дальше не идет
    cout<<" русский 1. текст --ok"<<endl;
    cout<<" русский 2. текст --ok"<<endl;
    cout<<" русский 3. текст --ok"<<endl;

    //--------------------- 4 не работают, но должны
        //SetConsoleCP(CP_UTF8);
        //SetConsoleOutputCP(CP_UTF8);

    return a.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.3.2017, 13:29