Polnische Schriftzeichen in der Konsole



  • Hallo,

    ich werde verrückt: ich bin ein Neueinsteiger und möchte mir ein Vokabeltrainer programmieren. Ich sitze schon seit Stunden am PC auf der Suche, wie ich jetzt polnische Sonderzeichen in der Konsole darstellen kann, also beispielsweise "ł ą ć".

    Mein ganz einfacher Code:

    #include <iostream>
    #include <fstream> 
    #include <string>
    
    using namespace std;
    
    int main(){
    
            setlocale(LC_ALL, "Polish"); // Dies habe ich auch mal auskommentiert, aber in beiden Fällen kein Erfolg
    
    	string line;
    	ifstream vokabeln; 
    
    	vokabeln.open("Lektion_1.txt", ios_base::in);
    
    	while (getline(vokabeln, line))
    	{
    		cout << line << '\n';
    	}
    
    	cout << "ł ą ć;" << endl; // Normal sollten hier die drei besagten Sonderzeichen von oben stehen, aber die wurden automatisch umkodiert, HTML hat wohl auch Probleme damit? Also es sollten die drei Sonderzeichen von oben sein. 
    
    	system("PAUSE");
    	return 0;
    }
    

    Ich benutze Visual Studio 2013 und habe schon die Kodierung auf "Mitteleuropäisch (DOS) - Codepage 852" gestellt. Auch andere Tipps im Internet haben mir nicht geholfen. Ich habe auch Unicode probiert, aber dies hat leider auch nicht funktioniert. Ich hoffe, ihr könnt mir helfen. Eine möglichst einfache Lösung wäre gut :-).

    Grüße
    Roooooooooooooobert



  • Du mußt auf der Konsole das passende Encoding einstellen: chcp



  • SetConsoleOutputCP ist dein Freund! Musst nur noch die entsprechende polnische Codepage finden!
    https://msdn.microsoft.com/de-de/library/windows/desktop/ms686036%28v=vs.85%29.aspx



  • du kannst auch _setmode verwenden.
    das zweite beispiel auf https://msdn.microsoft.com/en-us/library/tw4k6df8(v=vs.100).aspx zeigt wie es funktioniert. damit kannst du mit unicode arbeiten.
    nicht vergessen eine passsende schrift fuer die ausgabe in der console einzustellen.

    Meep Meep



  • Leider bekomme ich dies weiter nicht hin. Ich habe gesucht, welche Nummer die polnischen Ziffern haben, es ist die "1250" (https://de.wikipedia.org/wiki/Windows-1250).

    #include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <Windows.h>
    
    using namespace std; 
    
    int main(){ 
    
            //setlocale(LC_ALL, "Polish"); // Dies habe ich auch mal auskommentiert, aber in beiden Fällen kein Erfolg 
    
      system("chcp 1250"); // ich habe nun mal dies versucht, leider kein Erfolg 
    
    	//SetConsoleOutputCP(1250); //Bei der Zeile drunter bekomme ich einen Fehler 
    //"1>c:\program files (x86)\windows kits\8.1\include\um\winnt.h(11527): error C2467: Deklaration des 
    //anonymen selbst definierten Typs 'struct' unzulässig"
    
        string line; 
        ifstream vokabeln; 
    
        vokabeln.open("Lektion_1.txt", ios_base::in); 
    
        while (getline(vokabeln, line)) 
        { 
            cout << line << '\n'; 
        } 
    
        cout << "ł ą ć;" << endl; // Normal sollten hier die drei besagten Sonderzeichen von oben stehen, aber die wurden automatisch umkodiert, HTML hat wohl auch Probleme damit? Also es sollten die drei Sonderzeichen von oben sein. 
    
        system("PAUSE"); 
        return 0; 
    }
    

    Die Schrift in der Konsole habe ich jetzt auf Lucia umgestellt, aber bringt keinen Erfolg. Bitte dringend um Hilfe.



  • Kann mir niemand helfen? 😞 😞 😞



  • Ich habs geschafft! Eigentlich ganz einfach:

    #include <windows.h>
    #include <iostream>
    #include <fstream> 
    #include <string> 
    
    using namespace std;
    
    int main(void)
    {
    	SetConsoleOutputCP(1250);
    	cout << "ł Ł ą ę ó ź ż ń ś ć" << endl;
    
    	system("Pause");
    		//getchar();
    	return 0;
    }
    

    Wichtig ist dabei, dass man dazu beim Speichern ebenfalls die Codierung "Mitteleuropäisch Windows 1250" auswählt und die Schrift in Lucida ändert.



  • Nur, ich hab jetzt noch EIN Problem: Ich möchte polnische Wörter von einer .txt-Datei einlesen, aber diese Symbole werden leider nicht richtig ausgegeben. Habt ihr eine Idee?



  • In welcher Codierung ist die Textdatei denn (UTF8, UTF16, ...)?

    Ab C++11 gibt es die passenden Klasse dafür schon in der Standard-Library: codecvt

    Edit: Um das Grundproblem zu verstehen, kannst du dir auch mal Reading UTF-8 with C++ Streams durchlesen.



  • Ich habe die Codierung UTF-8. Kannst du mir bitte explizit sagen, was ich schreiben soll? Ich bin mit den Seiten etwas überfordert, bin blutiger Anfänger. Ich stelle mal den Code rein, wie ich es bis jetzt einlese:

    #include <windows.h>
    #include <iostream>
    #include <fstream> 
    #include <string> 
    
    using namespace std;
    
    int main(void)
    {
        SetConsoleOutputCP(1250);
    
        string line;
        ifstream vokabeln; 
    
        vokabeln.open("Lektion_1.txt", ios_base::in);
    
        while (getline(vokabeln, line))
        {
            cout << line << '\n';
        }
    
        system("Pause");
    
        return 0;
    }
    

    In der Textdatei steht:
    "Bałtyk
    Ostsee
    Tatry
    Tatra"



  • RobertB schrieb:

    Ich bin mit den Seiten etwas überfordert, bin blutiger Anfänger.

    Kannst Du nicht einfach einen Englischvokabeltrainer programmieren? Und auch in dem würde ich deutsche Umlaute nicht vorkommen lassen, bzw. ersetzen.

    Sich großartig mit der Codierung von Zeichensätzen usw. zu beschäftigen hilft nämlich nicht beim C++ lernen.



  • Ich brauche aber leider diesen Trainer, mit Sonderzeichen -.-. Ich brauche doch eig. nur noch das Einlesen bzw. später das Schreiben in eine Textdatei, der Rest ist doch dann nicht mehr so kompliziert.



  • Hast du denn einen C++11 Compiler?

    Ansonsten mußt du halt den Weg aus dem von mir verlinkten Artikel gehen oder dir eine UTF8-Lib suchen, z.B. UTF8-CPP: UTF-8 with C++ in a Portable Way.

    Das ist nunmal kein einfaches Thema, s.a. UTF-8 Everywhere.

    Ich persönlich würde dir ja dafür zu C# raten, da .NET intern UCS2 (UTF-16) benutzt und die ganzen Encodings schon eingebaut hat...



  • Ist C# arg anders als C++, ich meine z.B. die ganzen Befehle?



  • Sieht in etwa so aus:

    using System;
    using System.IO;
    using System.Text;
    
    namespace MyApplication
    {
        public class Program
        {
            public void Main()
            {
                string text = File.ReadAllText("vokabeln.txt", Encoding.UTF8);
    
                Console.WriteLine(text);
            }
        }
    }
    

    - und das solltest du wohl verstehen 😉
    Die meisten Keywords (wie

    for, while, if, else, ...
    

    gibt es selbstverständlich auch...

    Beim obigen Programcode müßtest du, wenn du es auf der Konsole ausführst, natürlich dort dann ebenso eine passende Schriftart und CodePage (wie beim C++ Programm) auswählen.

    Aber in C# läßt sich mit WinForms auch schnell und einfach eine GUI erzeugen, so daß du dann diese Probleme mit der Konsole nicht mehr hättest.

    PS: Ich bin Moderator im C#-Forum der Entwickler-Ecke


Log in to reply