Привет всем. Столкнулся с неприятной проблемой, требуется помощь тех, кто работал с SFML и С++.
Я работаю над одним проектом с помощью SFML на C++ в CLion на Windows 11 через компилятор MSCV.
По каким-то причинам я не в состоянии вывести кириллицу.
На скриншоте вы можете наблюдать как я создаю объект класса sf::Text в конструктор которого я передаю текст написанный на кириллице.
На втором скриншоте мы можете наблюдать то как SFML отрисовывает этот текст.
К сожалению такая проблема не только с SFML, а в целом. Я выводил "Текст" в stdout и в CLion и в Visual Studio, но результат все разочаровавший; вы можете наблюдать результаты также на соответсвующих скринах.
Мне нужна помощь! Я хочу, чтобы кто-то дал мне решение решить проблему с выводом не ASCII символов. Буду благодарен!
>>3514015 (OP) Deepseek Проблема с выводом кириллицы в C++ (особенно в Windows) — распространённая ситуация, и её можно решить несколькими способами. Вот основные причины и решения:
---
### 1. Кодировка исходного файла Убедитесь, что ваш файл `.cpp` сохранён в правильной кодировке (например, UTF-8 с BOM или CP1251). В CLion: → File → Settings → Editor → File Encodings → Установите кодировку для проекта и текущего файла в UTF-8 (или Windows-1251, если нужно). → Пересохраните файл.
---
### 2. Настройка локали в C++ Добавьте в начале `main()` вызов `setlocale` или `std::setlocale`: ```cpp #include <clocale>
int main() { setlocale(LC_ALL, "ru_RU.UTF-8"); // Для Linux/Mac // Или для Windows: setlocale(LC_ALL, "Russian"); // Альтернатива: std::setlocale(LC_ALL, ""); // Автоматически выбирает системную локаль ... } ```
---
### 3. Для SFML: шрифт и кодировка текста SFML требует: 1) Правильный шрифт, поддерживающий кириллицу (например, `Arial`, `Times New Roman` или любой `.ttf` с русскими символами). 2) Корректную передачу строки в `sf::Text`.
#### Важно: - Шрифт должен поддерживать кириллицу. Проверьте его в системе или загрузите `.ttf` в папку с проектом. - Если строка жёстко закодирована в `.cpp`, убедитесь, что файл сохранён в UTF-8.
---
### 4. Для консоли (std::cout) В Windows консоль по умолчанию использует кодировку CP866 (или CP1251), а не UTF-8. Решение: 1) Изменить кодировку консоли программно: ```cpp #include <windows.h>
int main() { SetConsoleOutputCP(CP_UTF8); // Переключаем консоль в UTF-8 SetConsoleCP(CP_UTF8);
std::cout << "Привет, мир!\n"; // Теперь кириллица должна работать return 0; } ``` 2) Или сохранить файл в CP1251 и не менять кодировку консоли.
---
### 5. Настройка CLion Если вывод в **Run/Debug** CLion некорректный: → Попробуйте добавить в настройки запуска (`Edit Configurations`) переменную среды: ``` JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF-8 ``` → Или изменить кодировку в самом CLion (как в п. 1).
---
### **6. Альтернатива: использование широких строк (wchar_t)** Если ничего не помогает, можно попробовать `std::wstring` и `sf::Text::setString` с широкими символами: ```cpp #include <SFML/Graphics.hpp> #include <locale>
int main() { std::locale::global(std::locale("Russian"));
sf::Text text; text.setFont(font); text.setString(L"Привет, SFML!"); // Обратите внимание на 'L' перед строкой
// ... } ```
---
### **Итог:** 1. Проверьте кодировку файла `.cpp` (лучше **UTF-8**). 2. Добавьте `setlocale` или `SetConsoleOutputCP`. 3. Убедитесь, что шрифт в SFML поддерживает кириллицу. 4. Если проблема в консоли — настройте кодировку вывода.
Если остались вопросы — уточните, где именно возникает проблема (SFML, консоль, IDE), и приведите пример кода.
>>3514015 (OP) 1. Ты делаешь что-то не так. Условный хелло-ворлд (демонстрация вывода текста) с офф-сайта (по крайне мере для версий 2.6) выводит кириллицу без проблем. Сотри, начни заново всё переустановив. Вряд ли разница в том, что у меня mingw, и какая-то хрень именно при компиляторе msvc возникает.
stb_truetype потыкай. И зависимости от sfml не будет, заработает и в месте, где не будет sfml.
>>3514015 (OP) Вот. Собрал на sfml 3.0 К слову он у тебя и есть, судя по тому, что в конструкторе sf::text ты указываешь сначала шрифт. В 2.6 вроде бы было наоборот, текст до шрифта.
К слову, я недели две назад в конфочках кидал сообщение, цитирую исходное сообщение: нет желающих поделать образовательный проект-игру на c++/sfml/opengl, на несколько десятков часов? Просто пальцы и извилины размять, получить +0.6 к навыкам. Образовательный момент заключается в создании несложной игры. Игры - очень хорошая область, где и физика, и математика, и логика поведения и принятия решений - и почти все области программирования есть как применить. Нет задачи получить игру, есть задача повелосипедировать.
Не интересует? Пока из результатов особо никто не откликнулся, я вот собрал оболочку уровня что ты видишь (посложнее, но на 2.6, сейчас переписываю на 3.0, там ещё всякие события потери фокуса окна и реакция на alt+enter есть), и ещё поставил раст (один из предложил на расте это делать), прослушал лекций на 6 часов и мне очень понравилось то что я услышал; и покликал в коде раста - но очень не понравились компилято- и установка-проблемы сильнее чем в си, 20 часов до первого openGL-треугольника потратил, и при этом это был opengl новый, а легаси opengl в режиме совместимости (что очевидно удобнее для проекта на пару десятков часов) я так и не смог запустить на расте.
>>3515806>>3515807 Попробуй мой код запусти. https://pastebin.com/q3y6w72t В Cmake SFML::Graphics SFML::System SFML::Network SFML::Window glew32.lib + openGL либы - не знаю как в визуалстудии оно указывается.
>>3515817 Свой код можешь скинуть, вырезав всё кроме текста? Я запущу у себя. Если работает, то значит либо компиляторопроблемы, либо билд sfml у тебя битый (я точно знаю, что он и раньше отлично кириллицу выводил), либо какая-то особенность win11 лютая, я не знаю, нет идей.
>>3515823 Моя гипотеза в том, что у тебя строка вида L"" раскрываться в другой набор байт, нежели у меня, и это какая-то особенность msvc. С u8 у меня не работает, результат как и у тебя.
Предлагаю как на втором скрине (https://pastebin.com/PeQHbv55) вывести последовательность байт и сравнить с моей. Если последовательность совпадает (до нулей) - проблема 100% не в коде. Ну и 40 поменяй на что-то, в дебаге у тебя это возможно упадёт, если компилятор следит за выходом за пределы массива.
>>3515841 То есть видишь у тебя в заголовке окна другие иероглифы. А там без L"" две строки одинаковые. Так не должно быть по идее.
>>3515845 Другое. Ясненько. Какое-то windows-1251 будто бы.
Может быть тебе сам файл исходников в utf-8 сохранить, а он сейчас у тебя в другой кодировке? IAR например разное выдаёт в зависимости от кодировки файла исходников. У меня просто все файлы в utf-8 и я об этом не думаю. То есть может быть такое, что мы на экране буквально одно и тоже видим, но если мы в бинарном виде откроем файлы, то у них будет разное содержимое, и ты когда вставляешь в свою IDE оно на лету кодировку меняет. А компилятор видит разные файлы и выдаёт разный результат.
>>3515850 Попробуй в sf::text в конструкторе укажи текст L"аАёЁяЯaAzZ" Попробуй возьми мой массив (это uint8_t) 48,4,16,4,81,4,1,4,79,4,47,4,97,0,65,0,122,0,90,0,0,0,0 ... и отрендери его, приведя его в const wchar_t* или что у тебя там передаётся в sf::text. Если заработает, тебе нужно будет все функции оборачивать в функцию преобразования кодировки, лол.
Ещё точно не ок, что у тебя заголовок окна другой.
>>3515883 Ну вот всё, совсем не сложно. Ну дальше там какой-нибудь constexpr-преобразователь для строк в юникод напишешь и все строки через него будешь кидать.
Или нужно всё-таки разобраться, какой литерал для utf-8 строк в msvc. Вот нейронка что-то про флаг /utf-8 пишет, проверить не могу, не имею msvc.
>>3515892 Проблема почти точно какая-то супер тупая, не люблю такие.
Если есть желание разобраться - я бы попробовал пересоздать проект, добавить несколько строк сразу со всеми способами u8"", L"", простой "", какие-то wstring wchar* = "" и так далее. После этого перед компиляцией без IDE явно через notepad++ открыть файл и преобразовать в кодировки utf-8 (и с bom и без него), utf-16, windows-1251 и так далее сколько есть вариантов разумных, и скомпилировать из командной строки вызвав cmake вручную в нужной папке. С твоего позволения, сам я этим заниматься не буду, да и msvc у меня нет. А, ну ты уже сделал.
Я кстати так и не понял, что у тебя за числа -48, 0, -94, 0, -48, 0, -75, 0, -48, 0, это какой-то utf-16 будто бы, но и не он, и нули какие-то лишние. Или оно вообще берёт код из windows-1251 (0..255), и пишет его, а потом ноль.
>>3515916 А вот тут уже setlocale или что там в с++ варианте с новой стандартной библиотекой. Наверное какой-нибудь std::setlocale(LC_ALL, "ru_RU.UTF-8") первой строкой в main.