'ä' 'ö' 'ü' - Vergleich schlägt fehl



  • Meine Funktion soll die Zeichen ä,ö und ü durch die entsprechenden Vokale a,o und u ersetzen. Ist übrigens ne Aufgabe vom Schiedermeier, da ich grad sehe, das du auch auf der FH-München bist. Hier nochmal eine etwas leserlichere Form meiner Funktion:

    void convert(StringBuilder buffer, char chr)
      	{
    		if ( chr == 'ä' )
    			buffer.append('a');
    		else if ( chr == 'ö' )
    			buffer.append('o');
    		else if ( chr == 'ü' )
    			buffer.append('u');
    		else
    			buffer.append(chr);
    	}
    

    Es werden definitiv andere Zeichen erkannt, nur die ä,ö,ü´s nicht. Wo liegt hier der Hund begraben? 😡
    Danke



  • Folgender Code gibt true aus.

    class Test {
    	public static void main(String[] args) {
    		char x = 'ä';
    		System.out.println(x == 'ä');
    	}
    }
    

    Probleme mit den UTF-16 chars dürftest du erst bei irgendwelchen asiatischen Zeichen kriegen. Ich würde mal sicherstellen
    - dass du tatsächlich die richtigen Zeichen übergibst
    - dass der Quelltext nicht in einer Kodierung gespeichert ist, die die Umlaute vernichtet. Benutze utf-8 oder sowas



  • Meine Textdatei ist mit UTF-8 codiert.
    Wenn ich folgende Zeichen einlese,

    Güte Miene böhses Spiell!
    "Cern" Forschung?
    Cholera:
    Yoda.
    Johannesbeere,Spühlung`
    

    und 1 zu 1 ausgebe, kommt

    küte mine böses spil!
    "kern" forsunk?
    kolera:
    ioda.
    ioanesbere,spülung`
    

    raus. BITTE NUR ä,ü,ö BEACHTEN, NICHT DEN RESTLICHEN TEXT!!!!
    Worauf deutet das denn hin 😕



  • die konsole kann kein utf-8. Windows, oder? Wie liest du die Zeichen ein, über die Konsole?



  • Ich nutze Ubuntulinux, das Terminal ist auf UTF-8 eingestellt.
    Der Text wird per Eingabeumlenkung aus einer Datei geholt.

    Das Einlesen und die Ausgabe auf der Konsole nimmt folgender Code vor.

    /* R. Schiedermeier, http://www.cs.fhm.edu/~rs
     * FB07 Informatik/Mathematik, FH Muenchen
     * Praktikum Softwareentwicklung I
     * WS2005/2006
     * Aufgabe: Rechtschreibreform
     */
    
    import java.io.*;
    
    /** Treiberprogramm das der Reihe nach die Klassen Stage1, Stage2, ... usw.
      * laedt und die betreffenden convert-Methoden aufruft,
      * bis keine Klasse mehr gefunden wird.
      */
    abstract class Stage
    {
        public static void main(String... args) throws Exception
        {
        	// die maximale Anzahl Umwandler, die angewendet werden sollen
        	final int maxStageNumber = args.length > 0?  Integer.parseInt(args[0]):  Integer.MAX_VALUE;
    
        	// Standardinput lesen und speichern
    	StringBuilder buffer = new StringBuilder();
    	for(int character = System.in.read();  character >= 0;  character = System.in.read())
    	    buffer.append((char)character);
    
    	// Umwandlerklassen Stage* nacheinander laden bis es keine mehr gibt
    	// oder die verlangte Anzahl durchgelaufen ist ...
    	try
    	{
    	    int stageNumber = 1;
    	    while(stageNumber <= maxStageNumber)
    	    {
    		// Nimmt den Ergebnistext dieser Umwandlung auf
    		final StringBuilder result = new StringBuilder();
    
    		// Umwandlerklasse instanziieren
    		final Stage stage = (Stage)Class.forName("Stage" + stageNumber).newInstance();
    
    		// Eingabetext zeichenweise an den Umwandler verfuettern
    		for(int position = 0;  position < buffer.length();  position++)
    	    	    stage.convert(result, buffer.charAt(position));
    
    		// Ergebnistext wird zum Eingabetext des naechsten Schrittes
    		buffer = result;
    
    		// Weiterzaehlen zur naechsten Umwandlerklasse
    		stageNumber++;
    	    }
    	}
    	catch(Exception ex) {}
    
        	// Endergebnis ausgeben
    	new PrintStream(System.out, true, "ISO8859_1").println(buffer);  
        }
    
        /** Verarbeitet das Zeichen chr und erweitert den
          * Puffer buffer nach Bedarf.
          * @param buffer Enthaelt den bisher produzierten Ergebnistext
          * und nimmt ggf. weitere Zeichen auf.
          * @param chr Naechstes Zeichen der Eingabe.
          */
        abstract void convert(StringBuilder buffer, char character);
    }
    

    Hier ist der PrintStream mit ISO8859_1 angegeben, wenn ich mein Terminal entsprechend anpasse, erhalte ich folgenden Text:

    küte mine böses spil!
    "kern" forsunk?
    kolera:
    ioda.
    ioanesbere,spülung`
    

    😕

    Sorry für die Umstände! Diese scheiss ä,ö und ü´s! 😡



  • public static void main(String[] args) { 
           StringBuilder builder = new StringBuilder();
    
           convert(builder, 'h');
           convert(builder, 'ä');
           convert(builder, 'l');
           convert(builder, 'l');
           convert(builder, 'ö');
           convert(builder, ' ');
           convert(builder, 'd');
           convert(builder, 'ü');
           System.out.println(builder.toString());
    }
    

    Ausgabe:
    hallo du



  • Ich meine auch, dass das geht. Du hast hier nur ein Kodierungsproblem. Stell doch mal den PrintStream auf utf-8. Mach überall Zwischenausgaben rein und schau, ab wann Müll da steht. Um sicherzugehen, dass die Ausgabe selber richtig ist, kannst nen fest einprogrammierten String mit Umlauten hernehmen. Hat euch der Schiedermeier nicht auf solche Probleme hingewiesen? Jetzt lässt er aber ganz schön nach. 😉



  • Ist dieser hässliche Code von deinem Prof.? Ich hof mal die Formatierung hats hier zerstört und das Original sieht besser aus.
    Das catch(Exception ex) {} zeugt ja von der Überzeugtheit, dass der Code gut sein muss und dann gleicht noch ein throws Exception, ja 👍 .
    Wenn man schon zu fault ist die Exceptions richtig zu handeln, dann könnte man doch ein e.printStackTrace einbauen.



  • Der Schiedermeier checkt's schon. Wahrscheinlich haben die noch keine Exceptions gehabt und in Java muss er sie ja fangen. Der Code ist halt schnell hingehackt 🙂 - brauchst nicht glauben, dass er bei Studenten sowas durchgehen lässt. Der gibt dir ne vier wenn das Finden von perfekten Zahlen völlig korrekt ist, nur nicht optimiert. 😉



  • Der Schiedermeier macht auf mich auch nen sehr guten Eindruck, seine Vorlesungen sind sehr gut. Bei Kommentaren kennt der aber nix... entweder gut oder garnicht kommentiert. Ich glaube, das er bei diesem Umfang des Programms sicher sein kann, das er keine Fehler macht!



  • Das mit den Exceptions glaub ich dir mal, aber mit gutem Beispiel vorangehen ...

    Aber die Formatierung ist doch scheiße. Sieht das original wirklich so aus?

    abstract class Stage 
    { 
        public static void main(String[] args) throws Exception 
        { 
            // Hier rücke ich mal ein
            // die maximale Anzahl Umwandler, die angewendet werden sollen 
            final int maxStageNumber = args.length > 0?  Integer.parseInt(args[0]):  Integer.MAX_VALUE; 
    
            // Standardinput lesen und speichern 
        // Wieso sollte ich einrücken 
        StringBuilder buffer = new StringBuilder(); 
        for(int character = System.in.read();  character >= 0;  character = System.in.read()) 
            buffer.append((char)character); 
    
        // Umwandlerklassen Stage* nacheinander laden bis es keine mehr gibt 
        // oder die verlangte Anzahl durchgelaufen ist ... 
        try 
        { 
            int stageNumber = 1; 
            while(stageNumber <= maxStageNumber) 
            { 
            // Einrücken, war da nicht was? Ach ne. 
            // Nimmt den Ergebnistext dieser Umwandlung auf 
            final StringBuilder result = new StringBuilder(); 
    
    ...
    


  • öhhh, ja
    http://www.informatik.fh-muenchen.de/~schieder/programmieren-praktikum-1/Stage.java

    Nochmal zu meinem Problem:
    Jetzt geht´s. Es lag an der Codierung der Datei, in der die convert() Funktion ist.
    Diese war auf utf-8 gestellt, mit ISO8859_1 läufts!
    Und dieser ganze Mist hat mich eine Abgabemöglichkeit gekostet!



  • Das original sieht besser aus, liegt wohl an der Mischung von Tab und Leer, dass das hier so scheiße aussieht.

    Und das ? : hat er auch entfernt.


Anmelden zum Antworten