Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
1

Отображение русских букв в SFML через переменную

08.02.2019, 21:36. Показов 6331. Ответов 18
Метки нет (Все метки)

Пишу игру на SFML. В частности функцию, которая считывает с файла русские буквы, в дальнейшем эти буквы отрисовываются на экран игры.
Как я понял существует один способ корректного отображения русс букв в SFML, и заключается он в том, чтобы добавить префикс L перед строкой. Но мне необходимо передавать строку не напрямую в функцию setString(), а через переменную recordline. Как в таком случае добавить этот префикс L?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::ifstream file;
std::string recordLine;
 
void fun(..., sf::Text & Text) {
    setlocale(LC_ALL, "ru");
    file.open(path);
    while (...)
    {
        std::getline(file, recordLine);
 
        if (...) {
                do { 
                   Text.setString(L"Русский"); //OK 
                    Text.setString(L"" + recordline); //error ?????????????????
 
                } while (...);
            }
        }
        
    }
    file.close();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2019, 21:36
Ответы с готовыми решениями:

Отображение русских букв
Наверное, избитая тема, но у меня ситуация немного не стандартная. Гуглил, но решения не сыскал....

Корректное отображение русских букв.
Столкнулся с проблемой корректного отображения русских букв. Раньше для того что бы буквы...

Не правильное отображение русских букв
Раньше было все пучком, а теперь жесть ;) http://бмфан.рф/dynamic.php По ссылке вы можете увидеть...

Неправильное Отображение Русских Букв
Всем привет. Обновил на свою голову клиента у пользователя (до 9.0.1 англ. стандартного). Сервер -...

18
50 / 36 / 14
Регистрация: 05.08.2016
Сообщений: 187
08.02.2019, 22:07 2
В Visual Studio в настройках проекта можно выбрать набор символов Юникод, вроде тогда не нужно использовать L.
Нужно использовать wstring, тогда L не нужен.
Миниатюры
Отображение русских букв в SFML через переменную  
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 22:21  [ТС] 3
Pavel250,
Ничего не изменилось. При преобразовании string в wstring следующем образом,
C++
1
2
std::wstring wstr(recordLine.begin(), recordLine.end());
      Text.setString(wstr);
выводится на экран вместо букв вот что:
Миниатюры
Отображение русских букв в SFML через переменную  
0
Don't worry, be happy
17266 / 10130 / 1963
Регистрация: 27.09.2012
Сообщений: 25,346
Записей в блоге: 1
08.02.2019, 22:31 4
kalambek, для начала разберитесь с тем, какая кодировка файла.
0
50 / 36 / 14
Регистрация: 05.08.2016
Сообщений: 187
08.02.2019, 22:34 5
А нельзя recordLine сразу объявить как wstring?
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 22:46  [ТС] 6
Croessmah, какую не используй, ничего не меняется. Только вот если поменять на Юникод, в таком случае не выводится вообще ничего
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 22:50  [ТС] 7
Pavel250, объявил. Русских букв по-прежнему нет, но вместо квадратиков теперь отрисовываются символы
Изображения
 
0
Don't worry, be happy
17266 / 10130 / 1963
Регистрация: 27.09.2012
Сообщений: 25,346
Записей в блоге: 1
08.02.2019, 22:56 8
Цитата Сообщение от kalambek Посмотреть сообщение
какую не используй, ничего не меняется.
Продолжим. Для начала разберитесь с тем, какая кодировка файла.
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 22:59  [ТС] 9
Croessmah, Продолжим. ANSI
0
Don't worry, be happy
17266 / 10130 / 1963
Регистрация: 27.09.2012
Сообщений: 25,346
Записей в блоге: 1
08.02.2019, 23:01 10
kalambek, в ANSI нет кириллических символов.
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 23:04  [ТС] 11
Croessmah, в Utf-8 зато есть, только если поменять на него, ничего не изменится
0
50 / 36 / 14
Регистрация: 05.08.2016
Сообщений: 187
08.02.2019, 23:10 12
А разве UTF-8 не Юникод?

Добавлено через 3 минуты
Croessmah, уже решал подобное
SFML. Кодировки и шрифты для кириллицы
0
15353 / 8301 / 2014
Регистрация: 30.01.2014
Сообщений: 14,174
08.02.2019, 23:25 13
Лучший ответ Сообщение было отмечено kalambek как решение

Решение

kalambek, wstring + wcout + файл в UTF-16.

Добавлено через 10 минут
Цитата Сообщение от kalambek Посмотреть сообщение
При преобразовании string в wstring следующем образом,
Так нельзя преобразовывать.
Если в std::string лежит utf-8, то преобразовать можно так:
C++
1
2
3
4
5
6
7
8
9
10
#include <locale>
 
//...........
 
std::string recordLine;
 
//..................
 
std::wstring_convert<std::codecvt_utf8<wchar_t>> cv;
Text.setString(cv.from_bytes(recordLine));
Правда этот способ может не работать по причине отсутствия поддержки в runtime.
В этом случае придется использовать какой-либо платформозависимый способ конвертации.
В любом случае просто скопировать байты в wstring - недостаточно.
1
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 23:28  [ТС] 14
Цитата Сообщение от Pavel250 Посмотреть сообщение
А разве UTF-8 не Юникод?
может и так, я о предложенных блокнотом кодировках говорю

Цитата Сообщение от Pavel250 Посмотреть сообщение
уже решал подобное
то что в случае прямой передачи строки в ф-цию setString() нужно добавить префикс L я понял ещё до того как создал эту тему
Миниатюры
Отображение русских букв в SFML через переменную  
0
0 / 0 / 0
Регистрация: 07.04.2015
Сообщений: 101
08.02.2019, 23:32  [ТС] 15
DrOffset, рабочий способ. Спасибо!
0
15353 / 8301 / 2014
Регистрация: 30.01.2014
Сообщений: 14,174
08.02.2019, 23:34 16
kalambek, в блокноте UTF-16 обозначается как "Юникод". Так что способ с чтением напрямую wstring тоже должен сработать.
0
Don't worry, be happy
17266 / 10130 / 1963
Регистрация: 27.09.2012
Сообщений: 25,346
Записей в блоге: 1
08.02.2019, 23:39 17
Цитата Сообщение от kalambek Посмотреть сообщение
в Utf-8 зато есть, только если поменять на него, ничего не изменится
Изменится. В файле будет лежать уже Юникод.
Цитата Сообщение от DrOffset Посмотреть сообщение
Если в std::string лежит utf-8, то преобразовать можно так:
В SFML можно сразу состряпать sf::String из utf8: sf::String::fromUtf8.

Цитата Сообщение от kalambek Посмотреть сообщение
ничего не изменится
Вот примерчик загрузки из utf8. Под виндой не проверял.
sfml_ct.zip
1
15353 / 8301 / 2014
Регистрация: 30.01.2014
Сообщений: 14,174
08.02.2019, 23:41 18
Цитата Сообщение от Croessmah Посмотреть сообщение
В SFML можно сразу состряпать sf::String из utf8: sf::String::fromUtf8.
Отлично. Это лучше гораздо.
0
Don't worry, be happy
17266 / 10130 / 1963
Регистрация: 27.09.2012
Сообщений: 25,346
Записей в блоге: 1
08.02.2019, 23:51 19
DrOffset, конечно, в SFML и из string с ANSI может кириллицу загрузить, но нужно указать локаль вторым параметром конструктора sf::String. Имхо, не надо так делать, лучше файл в Юникод конвертнуть и работать. Вообще, внутри sf::String представляет собой std::basic_string<Uint32> с UTF-32 кодировкой.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2019, 23:51

Некорректное отображение русских букв
Извиняюсь что вечно с вопросами но я не понимаю в чем дело. После настройки Apache...

Некоректное отображение русских букв
Здравствуйте товарищи. Есть запрос на добавление данных в присоединенный dbf файл. Если этот...

Ввод и отображение русских букв
Попался вот такой экзаменационный билет: Напишите программу, которая допускает ввод и...

Некоректное отображение русских букв vc2010
В консольных приложениях в 2010 не отображаются корректно русские буквы .В чем причина.Заранее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru