Главная Юзердоски Каталог Трекер NSFW Настройки

Программирование

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 34 24 5
Вывод не ASCII символов Аноним 06/08/25 Срд 20:45:44 3514015 1
image.png 17Кб, 460x159
460x159
image.png 17Кб, 913x293
913x293
image.png 40Кб, 402x562
402x562
image.png 39Кб, 718x366
718x366
Привет всем. Столкнулся с неприятной проблемой, требуется помощь тех, кто работал с SFML и С++.

Я работаю над одним проектом с помощью SFML на C++ в CLion на Windows 11 через компилятор MSCV.

По каким-то причинам я не в состоянии вывести кириллицу.

На скриншоте вы можете наблюдать как я создаю объект класса sf::Text в конструктор которого я передаю текст написанный на кириллице.

На втором скриншоте мы можете наблюдать то как SFML отрисовывает этот текст.

К сожалению такая проблема не только с SFML, а в целом. Я выводил "Текст" в stdout и в CLion и в Visual Studio, но результат все разочаровавший; вы можете наблюдать результаты также на соответсвующих скринах.

Мне нужна помощь! Я хочу, чтобы кто-то дал мне решение решить проблему с выводом не ASCII символов. Буду благодарен!
Аноним 06/08/25 Срд 21:24:26 3514049 2
>>3514015 (OP)
это консоль виндовая, гугли как в ней кодепейж поменять, или через винапи конвертируй юникод в кодировки виндовс как петух
Аноним 06/08/25 Срд 22:21:02 3514080 3
Аноним 07/08/25 Чтв 10:40:20 3514305 4
>>3514080
chcp 65001 //unicode
chcp 936 //sChinese
Аноним 07/08/25 Чтв 13:07:40 3514470 5
>>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`.

#### Пример:
```cpp
#include <SFML/Graphics.hpp>

int main() {
setlocale(LC_ALL, "Russian");

sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Кириллица");

// Загружаем шрифт (убедитесь, что файл существует!)
sf::Font font;
if (!font.loadFromFile("arial.ttf")) {
// Обработка ошибки
return 1;
}

// Создаём текст (кириллица в UTF-8)
sf::Text text("Привет, SFML!", font, 30);
text.setPosition(100, 100);

while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}

window.clear();
window.draw(text);
window.display();
}

return 0;
}
```

#### Важно:
- Шрифт должен поддерживать кириллицу. Проверьте его в системе или загрузите `.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), и приведите пример кода.
Аноним 07/08/25 Чтв 20:33:11 3514794 6
>>3514470
Ни один из методов не помог
Аноним 07/08/25 Чтв 20:39:10 3514799 7
image.png 40Кб, 365x589
365x589
image.png 41Кб, 464x561
464x561
>>3514470

std::setlocale не помогает
Аноним 07/08/25 Чтв 21:10:07 3514832 8
image.png 73Кб, 1163x499
1163x499
image.png 73Кб, 1057x493
1057x493
Аноним 07/08/25 Чтв 21:10:53 3514833 9
>>3514305
оно помогает выводить в терминал, но никак не с SFML
Аноним 08/08/25 Птн 19:57:44 3515772 10
>>3514015 (OP)
1. Ты делаешь что-то не так. Условный хелло-ворлд (демонстрация вывода текста) с офф-сайта (по крайне мере для версий 2.6) выводит кириллицу без проблем. Сотри, начни заново всё переустановив.
Вряд ли разница в том, что у меня mingw, и какая-то хрень именно при компиляторе msvc возникает.

stb_truetype потыкай.
И зависимости от sfml не будет, заработает и в месте, где не будет sfml.
Аноним 08/08/25 Птн 20:37:13 3515804 11
изображение.png 164Кб, 1517x1207
1517x1207
>>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 в режиме совместимости (что очевидно удобнее для проекта на пару десятков часов) я так и не смог запустить на расте.
Аноним 08/08/25 Птн 20:41:02 3515806 12
Screenshot-2025[...].png 108Кб, 1001x688
1001x688
>>3515772

Я использую SFML 3.0.0.

И я попробовал такой код с С++17, но я получил не совсем то, что хотел.
На С++20 или С++23 текст такой-же как в первых моих скринах
Аноним 08/08/25 Птн 20:42:56 3515807 13
image.png 144Кб, 1397x756
1397x756
>>3515806
Еще я пробовал вот такой код, который посоветовали на форуме SFML; бесполезно
Аноним 08/08/25 Птн 20:46:35 3515811 14
>>3515806>>3515807
Попробуй мой код запусти. https://pastebin.com/q3y6w72t
В Cmake SFML::Graphics SFML::System SFML::Network SFML::Window glew32.lib + openGL либы - не знаю как в визуалстудии оно указывается.
Аноним 08/08/25 Птн 20:47:23 3515812 15
>>3515811
Ну, шрифт только поменяй на тот, что у тебя есть. И шрифт попробуй перекачай, вдруг у тебя битый файл.
Аноним 08/08/25 Птн 20:52:22 3515817 16
image.png 179Кб, 1197x883
1197x883
Аноним 08/08/25 Птн 20:54:40 3515818 17
image.png 146Кб, 1073x892
1073x892
Аноним 08/08/25 Птн 20:56:05 3515822 18
>>3515817
Свой код можешь скинуть, вырезав всё кроме текста? Я запущу у себя. Если работает, то значит либо компиляторопроблемы, либо билд sfml у тебя битый (я точно знаю, что он и раньше отлично кириллицу выводил), либо какая-то особенность win11 лютая, я не знаю, нет идей.
Аноним 08/08/25 Птн 20:58:39 3515823 19
Аноним 08/08/25 Птн 21:14:44 3515835 20
изображение.png 109Кб, 1184x908
1184x908
изображение.png 107Кб, 1666x661
1666x661
>>3515823
Моя гипотеза в том, что у тебя строка вида L"" раскрываться в другой набор байт, нежели у меня, и это какая-то особенность msvc. С u8 у меня не работает, результат как и у тебя.

Предлагаю как на втором скрине (https://pastebin.com/PeQHbv55) вывести последовательность байт и сравнить с моей. Если последовательность совпадает (до нулей) - проблема 100% не в коде. Ну и 40 поменяй на что-то, в дебаге у тебя это возможно упадёт, если компилятор следит за выходом за пределы массива.
Аноним 08/08/25 Птн 21:21:33 3515841 21
image.png 198Кб, 1778x911
1778x911
>>3515835
Буквально скопипастил твой код
Аноним 08/08/25 Птн 21:24:15 3515844 22
>>3515841
Циферки в консоли какие? Как он строчку с L"" преобразует в байты?
Аноним 08/08/25 Птн 21:24:51 3515845 23
>>3515844
-48, 0, -94, 0, -48, 0, -75, 0, -48, 0, -70, 0, -47, 0, -127, 0, -47, 0, 26, 32, 32, 0, 32, 0, 122, 0, 90, 0, 97, 0, 65,
0, -47, 0, -113, 0, -48, 0, -81, 0,
Аноним 08/08/25 Птн 21:29:09 3515849 24
изображение.png 9Кб, 469x147
469x147
>>3515841
То есть видишь у тебя в заголовке окна другие иероглифы. А там без L"" две строки одинаковые. Так не должно быть по идее.

>>3515845
Другое. Ясненько. Какое-то windows-1251 будто бы.


Может быть тебе сам файл исходников в utf-8 сохранить, а он сейчас у тебя в другой кодировке? IAR например разное выдаёт в зависимости от кодировки файла исходников. У меня просто все файлы в utf-8 и я об этом не думаю.
То есть может быть такое, что мы на экране буквально одно и тоже видим, но если мы в бинарном виде откроем файлы, то у них будет разное содержимое, и ты когда вставляешь в свою IDE оно на лету кодировку меняет. А компилятор видит разные файлы и выдаёт разный результат.
Аноним 08/08/25 Птн 21:32:03 3515850 25
image.png 261Кб, 1618x1046
1618x1046
>>3515849
И кодировка тоже UTF-8))
Аноним 08/08/25 Птн 21:41:21 3515859 26
>>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. Если заработает, тебе нужно будет все функции оборачивать в функцию преобразования кодировки, лол.

Ещё точно не ок, что у тебя заголовок окна другой.
Аноним 08/08/25 Птн 21:58:58 3515883 27
image.png 130Кб, 1374x695
1374x695
Аноним 08/08/25 Птн 22:12:48 3515891 28
изображение.png 31Кб, 764x317
764x317
>>3515883
Ну вот всё, совсем не сложно. Ну дальше там какой-нибудь constexpr-преобразователь для строк в юникод напишешь и все строки через него будешь кидать.

Или нужно всё-таки разобраться, какой литерал для utf-8 строк в msvc. Вот нейронка что-то про флаг /utf-8 пишет, проверить не могу, не имею msvc.
Аноним 08/08/25 Птн 22:13:30 3515892 29
>>3515859
Использовав твои uint8_t оно вывело кириллицу без проблем.
Теперь я нихрена не пойму почему у меня неправильно кодируется текст
Аноним 08/08/25 Птн 22:21:11 3515901 30
image.png 66Кб, 915x524
915x524
>>3515891
Не. Не робит. Я положил кириллицу, кастовал в int8_t или uint8_t, извлек числа, вставил в массив, пытался реинтерпретировать
Аноним 08/08/25 Птн 22:27:49 3515906 31
image.png 203Кб, 1431x961
1431x961
>>3515891


БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ

я добавил BOM и все заработало
Аноним 08/08/25 Птн 22:36:34 3515916 32
image.png 59Кб, 693x632
693x632
>>3515906
Теперь незначительная беда. Я не могу вывести его в терминал
Аноним 08/08/25 Птн 22:40:58 3515919 33
image.png 83Кб, 560x832
560x832
>>3515916
так тоже не работает
Аноним 08/08/25 Птн 22:43:29 3515924 34
>>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.
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов