Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.141.202] |
|
Сообщ.
#1
,
|
|
|
Добрый день (или ночь), уважаемые знатоки. Собрался я сделать консольный клиент Телеграмма, день разбирался с CMake и прочими, и прочими, и таки скомпилировал, правда клиент выводил крякозябры. Думал, проблема на пять минут. Сижу уже день. Вот этот код выводил крякозябры:
std::cerr << "Got message: [chat_id:" << chat_id << "] [from:" << sender_user_name << "] [" << text << "]" << std::endl; После анализа крякозябров, я понял, что в text и sender_user_name хранятся полноценные utf16 с двухбайтовыми символами, как положено. Написал это: 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 после одной попытки работать вообще перестаёт. Пробовал вообще тупо выводить побайтово на экран, но и тут нет: std::cout << (unsigned short int)s[i]; //Выводит числа в районе 65000, которые в строке ниоткуда браться не могут Такое впечатление, что оптимизатор включен на О3. А отключить я его не могу, потому что из-за заоблачной сложности проекта сборкой занимается CMake. Я ему в параметрах Debug задал, эффекта нет. В общем, подскажите, как написать что-то в условиях отсутствия отладчика и (как я полагаю) включенной на максимум оптимизации? Уже прям не знаю, что делать. Пойду пробовать конвертировать строку в utf8. Прикреплённый файлtd_example.cpp (11,44 Кбайт, скачиваний: 164) Прикреплённый файлCMakeLists.txt (296 байт, скачиваний: 79) |
Сообщ.
#2
,
|
|
|
Формально ты можешь предварительно исполнить что-то типа
std::wcerr.imbue(std::locale(std::locale(), new std::codecvt_utf16<wchar_t>)); |
Сообщ.
#3
,
|
|
|
Цитата k.sovailo @ ..Вот этот код выводил крякозябры: std::cerr << "Got message: [chat_id:" << chat_id << "] [from:" << sender_user_name << "] [" << text << "]" << std::endl; После анализа крякозябров, я понял, что в text и sender_user_name хранятся полноценные utf16 с двухбайтовыми символами, как положено. Тогда это похоже на ошибку сборки. строка: std::cerr << "Got message: [chat_id:" << ... как бы предполагает, что работа происходит с ASCII - строками. А у тебя получились UTF16. Какой-то флажок при сборке поставлен не так. |
Сообщ.
#4
,
|
|
|
Так, ладно, всем спасибо. Просто и элегантно проблему решить не получилось. Я очень сильно затупил, в строках хранились таки UTF8-строки, заставить работать с ними консоль у меня не получилось, скомпилировать проект с помощью VS тоже (так что работаю опять с CMake вслепую). Проблема решилась написанием своего велосипеда, заменяющего iostream на WinAPI (ConsoleWiteW/ConsoleReadW). Вечером попробую прикрутить велосипед к проекту, о результате напишу.
|
Сообщ.
#5
,
|
|
|
Цитата k.sovailo @ Просто и элегантно проблему решить не получилось. Я очень сильно затупил, в строках хранились таки UTF8-строки, заставить работать с ними консоль у меня не получилось, Чисто случайно только что решал эту же проблему. Путь такой: 1. UTF8_2_UTF16 посредством "MultiByteToWideChar" 2. UTF16_2_OEM посредством "CharToOemBuffW" |