На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Не могу банально вывести строку на экран , Тут происходят странные вещи, я уже извёлся
    Добрый день (или ночь), уважаемые знатоки. Собрался я сделать консольный клиент Телеграмма, день разбирался с CMake и прочими, и прочими, и таки скомпилировал, правда клиент выводил крякозябры. Думал, проблема на пять минут. Сижу уже день. Вот этот код выводил крякозябры:

    ExpandedWrap disabled
      std::cerr << "Got message: [chat_id:" << chat_id << "] [from:" << sender_user_name << "] [" << text << "]" << std::endl;


    После анализа крякозябров, я понял, что в text и sender_user_name хранятся полноценные utf16 с двухбайтовыми символами, как положено. Написал это:

    ExpandedWrap disabled
      std::wcerr << L"Got message: [chat_id:" << chat_id << L"] [from:" << (wchar_t*)(sender_user_name.data()) << L"] [" << (wchar_t*)(text.data()) << L"]" << std::endl;


    Не помогло. Раз пятьдесят пробовал уже: то ничего не выводит, то выводит не тот кусок текста, то wcerr после одной попытки работать вообще перестаёт. Пробовал вообще тупо выводить побайтово на экран, но и тут нет:

    ExpandedWrap disabled
      std::cout << (unsigned short int)s[i]; //Выводит числа в районе 65000, которые в строке ниоткуда браться не могут


    Такое впечатление, что оптимизатор включен на О3. А отключить я его не могу, потому что из-за заоблачной сложности проекта сборкой занимается CMake. Я ему в параметрах Debug задал, эффекта нет. В общем, подскажите, как написать что-то в условиях отсутствия отладчика и (как я полагаю) включенной на максимум оптимизации? Уже прям не знаю, что делать. Пойду пробовать конвертировать строку в utf8.
    Прикреплённый файлПрикреплённый файлtd_example.cpp (11,44 Кбайт, скачиваний: 161)
    Прикреплённый файлПрикреплённый файлCMakeLists.txt (296 байт, скачиваний: 78)
    Сообщение отредактировано: k.sovailo -
      Формально ты можешь предварительно исполнить что-то типа
      ExpandedWrap disabled
        std::wcerr.imbue(std::locale(std::locale(), new std::codecvt_utf16<wchar_t>));
      но, боюсь, это не то, что требуется.. Ещё нужно решить проблему с шрифтами.
        Цитата k.sovailo @
        ..Вот этот код выводил крякозябры:

        ExpandedWrap disabled
          std::cerr << "Got message: [chat_id:" << chat_id << "] [from:" << sender_user_name << "] [" << text << "]" << std::endl;


        После анализа крякозябров, я понял, что в text и sender_user_name хранятся полноценные utf16 с двухбайтовыми символами, как положено.

        Тогда это похоже на ошибку сборки.
        строка:
        ExpandedWrap disabled
          std::cerr << "Got message: [chat_id:" << ...

        как бы предполагает, что работа происходит с ASCII - строками.
        А у тебя получились UTF16. Какой-то флажок при сборке
        поставлен не так.
        Сообщение отредактировано: ЫукпШ -
          Так, ладно, всем спасибо. Просто и элегантно проблему решить не получилось. Я очень сильно затупил, в строках хранились таки UTF8-строки, заставить работать с ними консоль у меня не получилось, скомпилировать проект с помощью VS тоже (так что работаю опять с CMake вслепую). Проблема решилась написанием своего велосипеда, заменяющего iostream на WinAPI (ConsoleWiteW/ConsoleReadW). Вечером попробую прикрутить велосипед к проекту, о результате напишу.
            Цитата k.sovailo @
            Просто и элегантно проблему решить не получилось. Я очень сильно затупил, в строках хранились таки UTF8-строки, заставить работать с ними консоль у меня не получилось,

            Чисто случайно только что решал эту же проблему.
            Путь такой:
            1. UTF8_2_UTF16 посредством "MultiByteToWideChar"
            2. UTF16_2_OEM посредством "CharToOemBuffW"
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0303 ]   [ 18 queries used ]   [ Generated: 29.03.24, 08:32 GMT ]