М.Двач / Программирование

Вывод не ASCII символов 6 авг, 20:45 3514015 В конец треда | Веб

17 Кб, 460x15917 Кб, 913x29340 Кб, 402x56239 Кб, 718x366

Привет всем. Столкнулся с неприятной проблемой, требуется помощь тех, кто работал с SFML и С++.

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

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

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

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

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

Мне нужна помощь! Я хочу, чтобы кто-то дал мне решение решить проблему с выводом не ASCII символов. Буду благодарен!

Ответы4049447057725804

2 6 авг, 21:24 2 3514049

>>3514015 (OP)
это консоль виндовая, гугли как в ней кодепейж поменять, или через винапи конвертируй юникод в кодировки виндовс как петух

Ответы4080

3 6 авг, 22:21 3 3514080

>>3514049
что?

Ответы4305

4 7 авг, 10:40 4 3514305

>>3514080
chcp 65001 //unicode
chcp 936 //sChinese

Ответы48324833

5 7 авг, 13:07 5 3514470

>>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), и приведите пример кода.

5 7 авг, 13:07 5 3514470

>>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), и приведите пример кода.

Показать весь текст
Ответы47944799

6 7 авг, 20:33 6 3514794

>>3514470
Ни один из методов не помог

7 7 авг, 20:39 7 3514799

40 Кб, 365x58941 Кб, 464x561

>>3514470

std::setlocale не помогает

8 7 авг, 21:10 8 3514832

73 Кб, 1163x49973 Кб, 1057x493

>>3514305

тоже не помогает

9 7 авг, 21:10 9 3514833

>>3514305
оно помогает выводить в терминал, но никак не с SFML

10 8 авг, 19:57 10 3515772

>>3514015 (OP)
1. Ты делаешь что-то не так. Условный хелло-ворлд (демонстрация вывода текста) с офф-сайта (по крайне мере для версий 2.6) выводит кириллицу без проблем. Сотри, начни заново всё переустановив.
Вряд ли разница в том, что у меня mingw, и какая-то хрень именно при компиляторе msvc возникает.

stb_truetype потыкай.
И зависимости от sfml не будет, заработает и в месте, где не будет sfml.

Ответы5806

164 Кб, 1517x1207
11 8 авг, 20:37 11 3515804

>>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 в режиме совместимости (что очевидно удобнее для проекта на пару десятков часов) я так и не смог запустить на расте.

108 Кб, 1001x688
12 8 авг, 20:41 12 3515806

>>3515772

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

И я попробовал такой код с С++17, но я получил не совсем то, что хотел.
На С++20 или С++23 текст такой-же как в первых моих скринах

Ответы58075811

144 Кб, 1397x756
13 8 авг, 20:42 13 3515807

>>3515806
Еще я пробовал вот такой код, который посоветовали на форуме SFML; бесполезно

Ответы5811

14 8 авг, 20:46 14 3515811

>>3515806>>3515807
Попробуй мой код запусти. https://pastebin.com/q3y6w72t
В Cmake SFML::Graphics SFML::System SFML::Network SFML::Window glew32.lib + openGL либы - не знаю как в визуалстудии оно указывается.

Ответы58125818

15 8 авг, 20:47 15 3515812

>>3515811
Ну, шрифт только поменяй на тот, что у тебя есть. И шрифт попробуй перекачай, вдруг у тебя битый файл.

Ответы5817

179 Кб, 1197x883
16 8 авг, 20:52 16 3515817

>>3515812
бесполезно

Ответы5822

146 Кб, 1073x892
17 8 авг, 20:54 17 3515818

>>3515811
бесполезно

18 8 авг, 20:56 18 3515822

>>3515817
Свой код можешь скинуть, вырезав всё кроме текста? Я запущу у себя. Если работает, то значит либо компиляторопроблемы, либо билд sfml у тебя битый (я точно знаю, что он и раньше отлично кириллицу выводил), либо какая-то особенность win11 лютая, я не знаю, нет идей.

Ответы5823

19 8 авг, 20:58 19 3515823

>>3515822

https://pastebin.com/Hp5TaQjV

Ответы5835

20 8 авг, 21:14 20 3515835

109 Кб, 1184x908107 Кб, 1666x661

>>3515823
Моя гипотеза в том, что у тебя строка вида L"" раскрываться в другой набор байт, нежели у меня, и это какая-то особенность msvc. С u8 у меня не работает, результат как и у тебя.

Предлагаю как на втором скрине (https://pastebin.com/PeQHbv55) вывести последовательность байт и сравнить с моей. Если последовательность совпадает (до нулей) - проблема 100% не в коде. Ну и 40 поменяй на что-то, в дебаге у тебя это возможно упадёт, если компилятор следит за выходом за пределы массива.

Ответы5841

198 Кб, 1778x911
21 8 авг, 21:21 21 3515841

>>3515835
Буквально скопипастил твой код

Ответы58445849

22 8 авг, 21:24 22 3515844

>>3515841
Циферки в консоли какие? Как он строчку с L"" преобразует в байты?

Ответы5845

23 8 авг, 21:24 23 3515845

>>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,

Ответы5849

9 Кб, 469x147
24 8 авг, 21:29 24 3515849

>>3515841
То есть видишь у тебя в заголовке окна другие иероглифы. А там без L"" две строки одинаковые. Так не должно быть по идее.

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

Может быть тебе сам файл исходников в utf-8 сохранить, а он сейчас у тебя в другой кодировке? IAR например разное выдаёт в зависимости от кодировки файла исходников. У меня просто все файлы в utf-8 и я об этом не думаю.
То есть может быть такое, что мы на экране буквально одно и тоже видим, но если мы в бинарном виде откроем файлы, то у них будет разное содержимое, и ты когда вставляешь в свою IDE оно на лету кодировку меняет. А компилятор видит разные файлы и выдаёт разный результат.

Ответы5850

261 Кб, 1618x1046
25 8 авг, 21:32 25 3515850

>>3515849
И кодировка тоже UTF-8))

Ответы5859

26 8 авг, 21:41 26 3515859

>>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. Если заработает, тебе нужно будет все функции оборачивать в функцию преобразования кодировки, лол.

Ещё точно не ок, что у тебя заголовок окна другой.

Ответы58835892

130 Кб, 1374x695
27 8 авг, 21:58 27 3515883

>>3515859
я сосал меня ебали

Ответы5891

31 Кб, 764x317
28 8 авг, 22:12 28 3515891

>>3515883
Ну вот всё, совсем не сложно. Ну дальше там какой-нибудь constexpr-преобразователь для строк в юникод напишешь и все строки через него будешь кидать.

Или нужно всё-таки разобраться, какой литерал для utf-8 строк в msvc. Вот нейронка что-то про флаг /utf-8 пишет, проверить не могу, не имею msvc.

Ответы59015906

29 8 авг, 22:13 29 3515892

>>3515859
Использовав твои uint8_t оно вывело кириллицу без проблем.
Теперь я нихрена не пойму почему у меня неправильно кодируется текст

Ответы5924

66 Кб, 915x524
30 8 авг, 22:21 30 3515901

>>3515891
Не. Не робит. Я положил кириллицу, кастовал в int8_t или uint8_t, извлек числа, вставил в массив, пытался реинтерпретировать

203 Кб, 1431x961
31 8 авг, 22:27 31 3515906

>>3515891

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

я добавил BOM и все заработало

Ответы5916

59 Кб, 693x632
32 8 авг, 22:36 32 3515916

>>3515906
Теперь незначительная беда. Я не могу вывести его в терминал

Ответы59195924

83 Кб, 560x832
33 8 авг, 22:40 33 3515919

>>3515916
так тоже не работает

34 8 авг, 22:43 34 3515924

>>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.

Обновить тред

« /pr/В начало тредаВеб-версияНастройки

/a//b//mu//s//vg/Все доски

Скачать тред только с превьюс превью и прикрепленными файлами

Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах.Подробнее

Пользуетесь скринридером — пишите, что можно улучшить.
Host-Food.ru — надёжный хостинг от 12 руб/мес | Free DNS
Зеркала М.Двача: m2ch.hk, m2ch.gq, m2ch.cf, m2ch.fapp.in, m2ch.lib, m2chfapiswfw2wcakptqp4o6ltgchvjuxfab7urxlduraomtlnhw5xad.onion