2016-05-29 13 views
1

Nun, ich habe eine Datei mit kyrillischen Zeichen. Ich lade es, bekomme einen String und versuche dann, es mit sf :: Text anzuzeigen. So sieht mein Code aus:Kyrillischen Text aus Datei anzeigen

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800,600),"Learn me"); 
    sf::Text before; 
    wifstream lvl; 
    lvl.open("text.txt"); 
    sf::Font font; 
    font.loadFromFile("CODE2000.ttf"); 
    before.setFont(font); 
    before.setCharacterSize(20); 
    before.setColor(sf::Color(150,150,150)); 
    wstring stri; 
    getline(lvl,stri); 
    before.setString(stri); 
    while(window.isOpen()){ 
     sf::Event event; 
     while(window.pollEvent(event)){ 
      switch(event.type){ 
     case sf::Event::Closed: 
      window.close(); 
      } 
     } 

     window.clear(); 
     window.draw(before); 
     window.display(); 
    } 
    lvl.close(); 
    return 0; 
} 

, aber dies zeigt nur seltsame Zeichen.

Dieser arbeitet:

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include <fstream> 
#include <string> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800,600),"Learn me"); 
    sf::Text before; 
    wifstream lvl; 
    lvl.open("text.txt"); 
    sf::Font font; 
    font.loadFromFile("CODE2000.ttf"); 
    before.setFont(font); 
    before.setCharacterSize(20); 
    before.setColor(sf::Color(150,150,150)); 
    wstring stri; 
    getline(lvl,stri); 
    sf::String text; 
    text=sf::String::fromUtf8(begin(stri),end(stri)); 
    before.setString(text); 
    while(window.isOpen()){ 
     sf::Event event; 
     while(window.pollEvent(event)){ 
      switch(event.type){ 
      case sf::Event::Closed: 
       window.close(); 
      } 
     } 

     window.clear(); 
     window.draw(before); 
     window.display(); 
    } 
    lvl.close(); 
    return 0; 
} 

Antwort

2

Ihr Problem hat nichts mit SFML zu tun, Sie sind falsch nur Lesen Sie die Datei.

C++ verwendet breite Zeichenfolgen (std::wstring), um UNICODE darzustellen. Dies ist nicht UTF-8. Um eine std::wstring aus einer UTF-8-codierten Datei zu lesen, lesen Sie bitte Read Unicode UTF-8 file into wstring und verwenden Sie die zweite Antwort.

Falls die Auftragsänderungen im Laufe der Zeit, dass derjenige sein würde, dass Sie diese Funktion verwenden sagt:

#include <sstream> 
#include <fstream> 
#include <codecvt> 

std::wstring readFile(const char* filename) 
{ 
    std::wifstream wif(filename); 
    wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>)); 
    std::wstringstream wss; 
    wss << wif.rdbuf(); 
    return wss.str(); 
} 

Sobald Sie eine gültige std::wstring aus Ihrer Datei erhalten haben, sollten Sie in der Lage sein, es zu benutzen mit SFML ohne Probleme.

+0

Ist das in Visual Studio, weil die C++ int Codeblocks tut eine codecvt Bibliothek ist es nur in Visual C++ @nvoigt –

+0

Es ist nicht Visual Studio, es ist C++ 11. Codeblöcke könnten die neuen Features nicht standardmäßig unterstützen. Versuchen Sie [dies] (http://stackoverflow.com/questions/18174988/how-can-i-add-c11-support-to-codeblocks-compiler), damit es funktioniert. – nvoigt