SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Вывод кириллицы
В этой теме 11 ответов, 4 участника, последнее обновление Mihail 6 года/лет, 4 мес. назад.
-
АвторСообщения
-
Вывожу текст на экран по методу 12 урока. Сначала все было нормально, но потом, без видимых причин, начали выводиться иероглифы. Понимаю , что проблема с кодировкой символов , но не знаю как исправить
Не используй конвертацию в std::string. Только sf::String поддерживает юникод
Не помогло. Те же иероглифы. Проблема не только в стринге. Название окна и даже кириллица в консоли так же выходят. Может можно как-то внутри кода или внутри IDE(Code::Blocks) изменить кодировку?
C++123456789int main(){setlocale(LC_ALL,"Rus");/*...*/return 0;}Не работает , как SetConsolCP(), хотя они ,по-моему, меняют вывод только в консоли, а не окне.(В других проектах это работает,а в проекте с SFML почему-то нет)
Попробуй следующее.
Установить в редакторе кодировку UTF-8: Settings -> Editor -> General settings -> Encoding settings.
Убедиться, что шрифт, который ты загружаешь в текст, поддерживает кириллицу.
Передать в текст широкую строку:C++12sf::Text my_text;my_text.setString(L"Привет, мир!");Шрифт поддерживает.
С широкой строкой текст выводится, но появляется еще одна проблема: вместе с текстом нужно вывести строку:
C++1text.setString(L"Камней собрано:"+scorestring.str());Здесь ругается компилятор на знак + , ведь L”камней собрано” для него уже не строка, а мы просим прибавить к этому строку.Пытался в коде как-то обойти или заменить эту строку, но ничего рабочего не придумал.
Когда переключаю кодировки в настройках, текст меняется, но не становится кириллицей.Видимо, окно использует какую-то свою кодировку, не зависящую от IDEМожно так:
C++1234567std::wostringstream score_string_stream;std::wstring score_string = L"Кол-во очков: ";score_string_stream << score_string;int score = 10;score_string_stream << score;sf::Text score_text;score_text.setString(score_string_stream.str());Теоретически должно работать, но почему-то не работает
Проверил у себя – всё работает. Если что-то не работает, надо конкретно описать что именно происходит, желательно ещё прикрепить код.
Можно попробовать такой вариант:
C++1234std::wstring score_string = L"Кол-во очков: ";int score = 10;sf::Text score_text;score_text.setString(score_string + std::to_wstring(score));Проверил его у себя, он тоже работает.
Создал новый проект и собрал заново- все работает. Не знаю что это было, но спасибо огромное!
Я проблему с русским текстом решил так:
Весь текст держу как wchar_t и всё норм.
C++12345678wchar_t* TextTitle = L"Русские буквы";// Из wchar_t* в sf:String переводится так:sf::String sfStr = sf::String(TextTitle);sf::Text text;text.setString(sf::String(TextTitle));// Для других случаев у меня есть StringHelper:std::string stdStr = StringHelper::WideStringToAnsi(TextTitle);text.setString(StringHelper::WideStringToAnsi(TextTitle) + " - v0.1");Сам StringHelper выглядит так:
C++123456789101112131415161718192021222324252627282930313233343536373839404142class StringHelper{public:static wchar_t* ToWCHAR(const char *c, UINT CodePage = CP_ACP){static wchar_t* result;int nChars = MultiByteToWideChar(CodePage, 0, c, -1, NULL, 0);result = new WCHAR[nChars];MultiByteToWideChar(CodePage, 0, c, -1, (LPWSTR)result, nChars);return result;}static const char* ToCHAR(wchar_t *c, UINT CodePage = CP_ACP){static char* result;int nChars = WideCharToMultiByte(CodePage, 0, c, -1, NULL, 0, NULL, NULL);result = new CHAR[nChars];WideCharToMultiByte(CodePage, 0, c, -1, (LPSTR)result, nChars, NULL, NULL);return result;}static std::wstring AnsiStringToWide(std::string const &Str, UINT CodePage = CP_ACP){DWORD const BuffSize = MultiByteToWideChar(CodePage, 0, Str.c_str(), -1, NULL, 0);if (!BuffSize) return NULL;std::vector<wchar_t> Buffer;Buffer.resize(BuffSize);if (!MultiByteToWideChar(CodePage, 0, Str.c_str(), -1, &Buffer[0], BuffSize)) return NULL;return (&Buffer[0]);}static std::string WideStringToAnsi(std::wstring const &Str, UINT CodePage = CP_ACP){DWORD const BuffSize = WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, NULL, 0, NULL, NULL);if (!BuffSize) return NULL;std::vector<char> Buffer;Buffer.resize(BuffSize);if (!WideCharToMultiByte(CodePage, 0, Str.c_str(), -1, &Buffer[0], BuffSize, NULL, NULL)) return NULL;return (&Buffer[0]);}}; -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.