• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed sfml - Polskie znaki w zmiennej string.

Object Storage Arubacloud
0 głosów
999 wizyt
pytanie zadane 26 sierpnia 2017 w C i C++ przez milosz263 Nowicjusz (240 p.)
zamknięte 31 sierpnia 2017 przez milosz263

Witam. Tak jak widać kodzie poniżej chciałem wprowadzić do zmiennej string polskie słowo używając L przed cudzysłowem (nie znam fachowej nazwy tego), ale niestety kompilator pokazuje taki błąd: 

error: no match for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'const wchar_t [11]')

//początek
std::string volume;
//w obsłudze jakiegoś zdarzenia
volume = L"Głośność: "; 
//w pętli głównej programu

sf::Text glosnosc(volume , comic, 50 );

  Gdy usunę L sprzed cudzysłowu to wszystko się kompiluje ale w programie są krzaki zamiast polskich znaków. Jest jakiś sposób aby nie było tych krzaków?

EDIT: podaję kod źródłowy: 

#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <cmath>
int mainvolume =100;
int vol = mainvolume;
std::wstring volume;
std::wstring intToStr(int n);
int main( int argc, char ** argv )
{
    sf::RenderWindow oknoAplikacji ( sf::VideoMode (800,600,32),"Kurs1");
    sf::Texture tekstura; //grafika
    tekstura.loadFromFile( "Grafika/1.png" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura ); //grafika koniec
    sf::Music muzyka;  //muzyka
    muzyka.openFromFile("Music.ogg");
    muzyka.play();
    muzyka.setVolume(mainvolume); //muzyka koniec
    sf::Font comic; //tekst i czcionki
    comic.loadFromFile ("Fonts/comic.ttf");
    //tekst i czcionki koniec
    while( oknoAplikacji.isOpen() ) // pêtla g³ówna
{
sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) ) //tu obs³uga zdarzeñ
        {
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )/* podgłaśnianie */ {
                mainvolume=vol+3;
                vol=mainvolume;
                if(mainvolume==99) { muzyka.setVolume(100);}
                else {muzyka.setVolume(mainvolume);}
                volume = L"Głośność: "  ;
                volume += mainvolume;
            }
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume =  L"Głośność: ";
                volume += mainvolume;
            }
            if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji.close();
        }
    vol = mainvolume;
    oknoAplikacji.clear( sf::Color::Black );
    oknoAplikacji.draw( obrazek );
    sf::Text glosnosc(volume , comic, 50 );
    glosnosc.setColor(sf::Color::Green);
    oknoAplikacji.draw(glosnosc);
    oknoAplikacji.display();
}    return 0;
}

 

komentarz zamknięcia: Rozwiązanie w komentarzach do najlepszej odpowiedzi. Sama odpowiedź nic nie dała.

2 odpowiedzi

0 głosów
odpowiedź 26 sierpnia 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 30 sierpnia 2017 przez milosz263
 
Najlepsza
#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <cmath>
int mainvolume =100;
int vol = mainvolume;
std::wstring volume;
std::wstring intToStr(int n);
int main( int argc, char ** argv )
{
    sf::RenderWindow oknoAplikacji ( sf::VideoMode (800,600,32),"Kurs1");
    sf::Texture tekstura; //grafika
    tekstura.loadFromFile( "Grafika/1.png" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura ); //grafika koniec
    sf::Music muzyka;  //muzyka
    muzyka.openFromFile("Music.ogg");
    muzyka.play();
    muzyka.setVolume(mainvolume); //muzyka koniec
    sf::Font comic; //tekst i czcionki
    comic.loadFromFile ("Fonts/comic.ttf");
    //tekst i czcionki koniec
    while( oknoAplikacji.isOpen() ) // pêtla g³ówna
{
sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) ) //tu obs³uga zdarzeñ
        {
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )/* podgłaśnianie */ {
                mainvolume=vol+3;
                vol=mainvolume;
                if(mainvolume==99) { muzyka.setVolume(100);}
                else {muzyka.setVolume(mainvolume);}
                volume = L"Głośność: "  ;
                volume += std::to_wstring(mainvolume);
            }
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume =  L"Głośność: ";
                volume += std::to_wstring(mainvolume);
            }
            if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji.close();
        }
    vol = mainvolume;
    oknoAplikacji.clear( sf::Color::Black );
    oknoAplikacji.draw( obrazek );
    sf::Text glosnosc;
    glosnosc.setString(volume);
    glosnosc.setFont(comic);
    glosnosc.setCharacterSize(50);
    glosnosc.setColor(sf::Color::Green);
    glosnosc.setStyle(sf::Text::Bold);
    oknoAplikacji.draw(glosnosc);
    oknoAplikacji.display();
}    return 0;
}

 

komentarz 26 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)
(linia nr 36)error: 'to_wstring' is not a member of 'std'|
komentarz 26 sierpnia 2017 przez mokrowski Mędrzec (155,460 p.)
C++11
komentarz 26 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)

MinGW posiada pewien błąd, który powoduje niedziałanie funkcji to_string oraz to_wstring. Zamiast nich możesz wykorzystać klasę std::stringstream:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    int i = 10;
    std::stringstream ss;
    ss << i;
    std::string s;
    ss >> s;
    std::cout << s << std::endl;
    return 0;
}

Kod ten przekonwertuje inta na stringa. W tym przypadku polskie znaki ci nie są potrzebne, więc zwykły string wystarczy.

komentarz 27 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

Zastosowałem to w taki sposób:

volume = "Głośność: "  ;
std::stringstream ss; ss << mainvolume;ss >> volume1;
volume += volume1;

używając wstring.

// przed tym jakieś oszczenienia z sfml
main.cpp||In function 'int main(int, char**)':|
main.cpp|36|error: no match for 'operator=' (operand types are 'std::wstring {aka std::basic_string<wchar_t>}' and 'const char [15]')|
main.cpp|36|note: candidates are:|
\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\basic_string.h|554|note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = wchar_t; _Traits = std::char_traits<wchar_t>; _Alloc = std::allocator<wchar_t>]|
\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\basic_string.h|554|note:   no known conversion for argument 1 from 'const char [15]' to 'const std::basic_string<wchar_t>&'|
\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\basic_string.h|562|note: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = wchar_t; _Traits = std::char_traits<wchar_t>; _Alloc = std::allocator<wchar_t>]|
\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\basic_string.h|562|note:   no known conversion for argument 1 from 'const char [15]' to 'const wchar_t*'|
//I tak dalej
komentarz 27 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

@Patrycjerz, niech zainstaluje nowszą wersję mingw (w64), wtedy to_string będzie mu działać.

 

@milosz263, jeśli volume jest typu wstring, wtedy powinieneś użyć strumienia std::wstringstream.

komentarz 27 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)

Oczywiście, najlepszą opcją byłoby pobranie nowszego kompilatora, lecz nie chciałem zbytnio komplikować sprawy i rozwiązać problem na dotychczasowej konfiguracji.

Miłoszu, tego stringstreama używasz jedynie do liczb, aby je przekonwertować na stringa. Oznacza to, że musiałbyś stworzyć dwa napisy, oddzielny dla napisu "Głośność" (std::wstring), oddzielny dla numerka (std::string).

Wpadłem jednak na nieco lepszy pomysł. Otóż możesz wykorzystać literały UTF-8:

std::string string_glosnosc(u8"Głośność ");
std::stringstream ss;
int wartosc_glosnosc;
ss << wartosc_glosnosc;
std::string string_wartosc_glosnosc;
ss >> string_wartosc_glosnosc;
string_glosnosc += string_wartosc_glosnosc;
sf::Text text_glosnosc(sf::String::fromUtf8(string_glosnosc.begin(), string_glosnosc.end()), font);

Ten sposób powinien już zadziałać na MinGW.

PS Jeśli dostaniesz błąd kompilacji w plikach SFML dotyczący std::back_inserter, to spróbuj dodać "#include <iterator>" do String.hpp (ten bug występuje w starszych wersjach biblioteki, w nowszych powinien być załatany).

komentarz 29 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

Nie wiem czy dobrze zrozumiałem ale dalej mam krzaki 

            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume = (u8"Głośność ");
                std::stringstream ss;ss << mainvolume;ss >> volume1;
                volume += volume1;/* volume to napis a volume1 cyfra glosnosc to sf::Text a comic to czcionka */
                sf::Text glosnosc(sf::String::fromUtf8(volume.begin(), volume.end()), comic);
            }

PS. przepraszam za długi brak odpowiedzi ale nie miałem internetu(dopiero dzisiaj udało mi się to naprawić).  

komentarz 29 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Czy czcionka obsługuje polskie znaki? Najlepiej pokaż cały kod i powiem ci, co jest w nim nie tak.
komentarz 29 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)
#include <iostream>
#include <sstream>
#include <string.h>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/Audio.hpp>
#include <cmath>
int mainvolume =100;
int vol = mainvolume;
std::string volume = (u8"Głośność ");
std::string volume1;
int main( int argc, char ** argv )
{
    sf::RenderWindow oknoAplikacji ( sf::VideoMode (800,600,32),"Kurs1");
    sf::Texture tekstura; //grafika
    tekstura.loadFromFile( "Grafika/1.png" );
    sf::Sprite obrazek;
    obrazek.setTexture( tekstura ); //grafika koniec
    sf::Music muzyka;  //muzyka
    muzyka.openFromFile("Music.ogg");
    muzyka.play();
    muzyka.setVolume(mainvolume); //muzyka koniec
    sf::Font comic; //tekst i czcionki
    comic.loadFromFile ("Fonts/comic.ttf");
    //tekst i czcionki koniec
    while( oknoAplikacji.isOpen() ) // pêtla g³ówna
{
sf::Event zdarzenie;
        while( oknoAplikacji.pollEvent( zdarzenie ) ) //tu obs³uga zdarzeñ
        {
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Up )/* podgłaśnianie */ {
                mainvolume=vol+3;
                vol=mainvolume;
                if(mainvolume==99) { muzyka.setVolume(100);}
                else {muzyka.setVolume(mainvolume);}
                volume = (u8"Głośność ");
                std::stringstream ss;ss << mainvolume;ss >> volume1;
                volume += volume1;
                sf::Text glosnosc(sf::String::fromUtf8(volume.begin(), volume.end()), comic);
            }
            if( zdarzenie.type == sf::Event::KeyPressed && zdarzenie.key.code == sf::Keyboard::Down )/* przyciszanie */ {
                mainvolume=vol-3;
                vol=mainvolume;
                if(mainvolume==1) { muzyka.setVolume(0);}
                else {muzyka.setVolume(mainvolume);}
                volume = (u8"Głośność ");
                std::stringstream ss;ss << mainvolume;ss >> volume1;
                volume += volume1;/* volume to napis a volume1 cyfra glosnosc to sf::Text a comic to czcionka */
                sf::Text glosnosc(sf::String::fromUtf8(volume.begin(), volume.end()), comic);
            }
            if( zdarzenie.type == sf::Event::Closed ) oknoAplikacji.close();
        }
    vol = mainvolume;
    oknoAplikacji.clear( sf::Color::Black );
    oknoAplikacji.draw( obrazek );
    sf::Text glosnosc(volume , comic, 50 );
    glosnosc.setColor(sf::Color::Green);
    oknoAplikacji.draw(glosnosc);
    oknoAplikacji.display();
}    return 0;
}

Czcionka to comic sans ms przekopiowana z folderu c:\windows\fonts

komentarz 29 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

Te krzaki to jak wyglądają? Zamiast ś czy ć są dwa znaki-krzaki, czy jeden? W jakim kodowaniu jest zapisany plik źródłowy?

komentarz 29 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Wydaję mi się, że problem leży nie w samym kodzie, lecz w jego kodowaniu. Sprawdź na dolnej belce Code::Blocksa, czy masz napisane "WINDOWS-1250". Jeśli tak, to wypadałoby przekonwertować cały tekst na UTF-8 lub napisać go od nowa w tym kodowaniu.
komentarz 29 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli posiadasz Notepad++, to możesz za jego pomocą spróbować zmienić to kodowanie. Włącz opcję "Konwertuj na format UTF-8 bez BOM" w menu "Format".
komentarz 30 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

@j23 Są dwa znaki. @Patrycjerz to nic nie dało. Mam na dolnej belce utf-8  i nawet po konwersji przez notepad++ jest tak jak na obrazku wyżej. 

1
komentarz 30 sierpnia 2017 przez maly Nałogowiec (37,190 p.)
sf::Text glosnosc(volume , comic, 50 );

Przecież tekst który wyświetlasz nie konwertujesz z utf-8.

1
komentarz 30 sierpnia 2017 przez j23 Mędrzec (194,920 p.)

@miłosz263, dziwne. Pewny jesteś, że czcionka obsługuje polskie litery? Testowałeś kod na "pewnych" czcionkach?

 

BTW, pozbądź się tych zmiennych globalnych i zrób tak:

std::ostringstream os;	
os << u8"Głośność " << mainvolume;
std::string volume = os.str();
	
sf::Text glosnosc(sf::String::fromUtf8(volume.begin(), volume.end()), comic);

 

komentarz 30 sierpnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
maly, dobrze mówisz. Aż dziw bierze, że tego wcześniej nie zauważyłem.
komentarz 30 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)

maly @j23 Dziękuje! pomogliście.

0 głosów
odpowiedź 26 sierpnia 2017 przez vector Dyskutant (9,200 p.)
zamist std::string użyj std::wstring
komentarz 26 sierpnia 2017 przez milosz263 Nowicjusz (240 p.)
Nie działa. Zamiast głośność: 100 to jest Głośność: d

Podobne pytania

0 głosów
1 odpowiedź 2,106 wizyt
0 głosów
2 odpowiedzi 725 wizyt
0 głosów
1 odpowiedź 1,147 wizyt
pytanie zadane 5 grudnia 2017 w C i C++ przez maciek061 Gaduła (4,490 p.)

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...