Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 02:32

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Java] Umlaute rausfiltern / FilterReader

Discussion on [Java] Umlaute rausfiltern / FilterReader within the General Coding forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
[Java] Umlaute rausfiltern / FilterReader

Hmm.. wusste nicht genau wie ich die Überschrift bennenen soll:
sollen für Semesterabschluss aufgabe ein Programm schreiben, dass eine txt datei einliesst, Wörter rausfiltert (Werden mittels ner Filter Klasse erstellt) damit wir sie vergleichen können, bla blubb (So ne billige "Plagiat version, wo dann ne Checksumme berechnet wird)

Jedenfalls bin ich eigentlich fertig, mir ist nur aufgefallen, dass er die Umlaute rauswirft bei meinem Buchstabenfilter (Er Filtert im Grunde alle Sonderzeichen raus. Nur Buchstaben und Zahlen werden zurück gegeben, damit man bei der Ausgabe z.B nicht "Untergang hat, sondern Untergang.)

Code:
package Plagiat;

import java.io.IOException;
import java.io.FilterReader;
import java.io.Reader;

public class FilterBuchstaben extends FilterReader {

    FilterBuchstaben(Reader in) {
        super(in);
    }

    /**
     * @see java.io.FilterReader
     */
    @Override
    public int read() throws IOException {

        int zeichen = in.read();

        if (zeichen > 255) {
            //solang bis ein zeichen erkannt wird
            zeichen = in.read();
        }
        if (zeichen == -1) {
            //Ende der Datei
            return -1;
        }
        //ruft die Methode auf um die zeichen zu filtern
        return ersetzeChar(zeichen);
    }

    public int ersetzeChar(int Char) {
        //ersetze die Buchstaben
        
        //wenn Char eine Zahl ist gib sie so zurück
        if (Character.isDigit(Char)) {
            return Char;
        }
        //wenn Char ein Großbuchstabe ist und ein Buchstabe (isLetter) 
        //wandel ihn zu einem "Kleinbuchstabe" um
        if (Character.isUpperCase(Char) && Character.isLetter(Char)) {
            return Character.toLowerCase(Char);
        }
        //wenn Char ein Kleinbuchsttabe ist und ein Buchstabe gib ihn so zurück
        if (Character.isLowerCase(Char) && Character.isLetter(Char)) {
            
            return Char;
        }
        //ansonsten gib ein Leerzeichen zurück (Falls Char ein Sonderzeichen ist)
        return 32;
    }
}

glaub hier das gleiche Problem

Code:
package Plagiat;
import java.io.IOException;
import java.io.FilterReader;
import java.io.Reader;

public class FilterWichtigesWort extends FilterReader {

    
    FilterWichtigesWort(Reader in){
        super(in);
    }
    
    
    /**
     * @see java.io.FilterReader
     */
    @Override
    public int read(char[] cbuf, int off, int len)throws IOException{
        String wort = "";
        int wortlaenge = in.read(cbuf, off, len);
        Plagiat p = new Plagiat();
        p.create_tm_unwichtigeWoerter();
        
        if(wortlaenge != -1){
            
            //Das Wort wird in einen String konvertiert um es
            //vergleichen zu können
            for(int i = 0; i < wortlaenge; i++){
                wort = wort + cbuf[i];
            }
            
            // wenn der Anfangsbuchstabe klein geschrieben ist & er ein Buchstabe ist & kein unwichtiges wort
            if (Character.isLowerCase(cbuf[0]) && Character.isLetter(cbuf[0]) && !p.pruefeAufUnwichtig(wort)) {
                //mach den Anfangsbuchstaben groß und ersetz sie in dem Char-Array.
                cbuf[0] = Character.toUpperCase(cbuf[0]);
                return wortlaenge;
            }
            
            return wortlaenge;
        }
        return -1;
    } 
}
Liegt ja sicherlich an isLetter() und das er keine Umlaute kennt sondern nur die Englischen Buchstaben? Könnte es ja mit ASCII Code machen, aber der Prof. meckert dann.

Frag mich grad wie ich das am besten lösen könne. Die Umlaute in ein Array packen und dann noch gesondert mitm if abfragen?
phreeak is offline  
Old 06/16/2012, 20:12   #2
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Ersetze die Umlaute doch dann beim Einlesen durch oe, ae, ... Oder ist das keine Alternative?
xNopex is offline  
Old 06/16/2012, 20:13   #3

 
Obilee's Avatar
 
elite*gold: 11
Join Date: May 2007
Posts: 62,452
Received Thanks: 29,520
Code:
char a = 'ä';
System.out.println(Character.isLetter(a));
kommt bei mir true raus. warum übergibst du überhaupt die char werte als int ( also den uni-code ) ?
Außerdem macht es viel mehr Sinn die txt Zeilenweise auszulesen.

Code:
BufferedReader in = new BufferedReader(new FileReader("text.txt"));
		String zeile = null;
		while ((zeile = in.readLine()) != null) {
			String[] words = zeile.split(" ");
                        //jetzt jedes wort aus der zeile prüfen ob es erlaubt ist und ggf. es großschreiben lassen.
		}
Obilee is offline  
Old 06/16/2012, 20:26   #4
 
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
Weil das wohl Standart ist. Auch nur so gelernt. Beim FileReader liesst man ja Zeichen für Zeichen und es kann auch ein -1 zurück gegeben werden (bedeutet dann beim in.read() dass das Ende der Datei erreicht ist)


Ja vieles macht mehr sinn, aber der Prof stellt die aufgabe ;D
phreeak is offline  
Old 06/16/2012, 20:27   #5

 
Obilee's Avatar
 
elite*gold: 11
Join Date: May 2007
Posts: 62,452
Received Thanks: 29,520
Es ist alles andere als standart daten characterweise einzulesen und aus dennen ein wort zu baun. Du machst dir das leben unnötig schwerer.

du weißt auch ob die txt zu ende ist wenn readLine null zurück gibt

edit:

Quote:
char a = 'ä';
System.out.println(Character.isLetter((int)a));
gibt ebenfalls true zurück, liegt also wohl nicht an isLetter.

gib mal ein beispiel an was gelesen wird und was nicht.

und der prof sagt in der aufgabe dass ihr das char weise einlesen müsst ?
Obilee is offline  
Old 06/16/2012, 20:32   #6
 
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
Wie gesagt, ist mach die aufgaben ja nicht, dort steht drinnen, das wir es so machen sollen. Zeichenweise auslesen, 3 Filter erstellen die das Regeln und im Eigentlichen Programmablauf wird das wort aus dem cbuf[] array erstellt. (In einem Filter wird jedes Wort "vor"-erstellt und zeichenweise im Array gespeichert und die wortlänge returned, damit es später erstellt werden kann)


Wie gesagt der Prof sagt, was er will und er denkt sich wohl was dabei. Sicherlich gehts auch anders, aber dann sagta "Stimmt das geht auch so, aber wir wollten das so, weil .. BAUM."
phreeak is offline  
Old 06/16/2012, 20:35   #7

 
Obilee's Avatar
 
elite*gold: 11
Join Date: May 2007
Posts: 62,452
Received Thanks: 29,520
kk,

btw:

Code:
public int ersetzeChar(int Char)
Char darfst du nicht als variablen namen nutzen, zeigt dir deine IDE es nicht als fehler an ? und welcher von den beiden code abschnitten verwendest du jetzt ?

btw2:

Code:
//wenn Char ein Kleinbuchsttabe ist und ein Buchstabe gib ihn so zurück
        if (Character.isLowerCase(Char) && Character.isLetter(Char)) {
            
            return Char;
        }
die lowercase abfrage ist hier auch sinnlos, weil an die stelle nur noch kleinbuchstaben ankommen können da alle großbuchstaben schon im ersten if abgefragt worden sind. außerdem solltest du draus ein else if machen.
Obilee is offline  
Old 06/16/2012, 20:42   #8
 
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
nö Netbeans zeigt nix an. nur wenn ich char kleinschreibe. Wollte das eh noch ändern, hatte das nur grad geschrieben in ner freien Minute.

Benutze beide klasse, wird ja dadurch geregelt

Code:
 public void leseDatei() {
        try {
        ww = new FilterWichtigesWort( 
                new FilterWorteErstellen  ( 
                        new FilterBuchstaben (
                                new BufferedReader (
                                        new FileReader(parameter)))));
        } catch (FileNotFoundException e) {
            System.out.println("Datei nicht gefunden!");
        }
    }


und später im programm ablauf werden die reads angesprochen, um dann jedes Wort erstellen zu können was in cbuf steht. (Was ja im Filter dann zeichenweise jedesmal reingeschrieben wird.)

Code:
while((wortlaenge = ww.read(cbuf, 0, cbuf.length)) != -1){ 

                for(int i = 0; wortlaenge > i; i++){
                    wort = wort +cbuf[i];
                }

... Jedes Wort wird dann noch auf wichtig und unwichtig geprüft..

}
phreeak is offline  
Old 06/16/2012, 20:46   #9

 
Obilee's Avatar
 
elite*gold: 11
Join Date: May 2007
Posts: 62,452
Received Thanks: 29,520
Code:
char a = 'ä';
		System.out.println(ersetzeChar((int)a));

public static int ersetzeChar(int Char) {
        //ersetze die Buchstaben
        
        //wenn Char eine Zahl ist gib sie so zurück
        if (Character.isDigit(Char)) {
        	System.out.println("1");
            return Char;
        }
        //wenn Char ein Großbuchstabe ist und ein Buchstabe (isLetter) 
        //wandel ihn zu einem "Kleinbuchstabe" um
        if (Character.isUpperCase(Char) && Character.isLetter(Char)) {
        	System.out.println("2");
            return Character.toLowerCase(Char);
        }
        //wenn Char ein Kleinbuchsttabe ist und ein Buchstabe gib ihn so zurück
        if (Character.isLowerCase(Char) && Character.isLetter(Char)) {
        	System.out.println("3");
            return Char;
        }
        System.out.println("4");
        //ansonsten gib ein Leerzeichen zurück (Falls Char ein Sonderzeichen ist)
        return 32;
    }
bei mir geht er in die richtigen ifs. also an der methode liegt es nicht. da er 2 bzw. 3 ausgibt.
bin jetzt fußball schaun, vllt. später bock nochmal zu schaun, die letzten 2 code abschnitte bringen mir auch nicht viel ohne zu wissen was welche variable ist bzw. vom welchen typ
Obilee is offline  
Old 06/17/2012, 14:50   #10
 
elite*gold: 0
Join Date: Sep 2009
Posts: 3,485
Received Thanks: 1,002
Problem hab ich mittlerweile gelöst.

FileReader benutzt die Codierung die vom System eingestellt wird (oder von Netbeans bei properties). In meiem Fall war es UTF-8. Die Textdatei die wir auslesen sollen, war aber in ANSII Codiert. Daher führte es wohl bei den Umlauten zwischen ANSII <-> UTF-8 zu nem Fehler, so dass die Umlaute nicht erkannt wurden.

Hab die Textdatei nun in UTF-8 Codiert und nun liesst er alles ohne Probleme aus.
phreeak is offline  
Old 06/17/2012, 21:45   #11

 
Obilee's Avatar
 
elite*gold: 11
Join Date: May 2007
Posts: 62,452
Received Thanks: 29,520
kk dann mach ich mal zu.

#closed
Obilee is offline  
Closed Thread


Similar Threads Similar Threads
Instrumente rausfiltern?
04/20/2011 - Music - 1 Replies
Ich bin mir sicher, dass es so etwas gibt. Aber kenne kein einziges Programm... Könnte jemand ein Programm posten womit ich gewisse songs, in Einzelteile zerlegen kann bzw. wo ich die Gitarre rausnehmen kann? Also Song ohne Gitarre, damit ich mein eigenes Spiel einfügen kann. Hab gesucht, aber ncihts gefunden^^ Wär klasse wenn ihr so etwas hättet und mir damit nen großen Schritt weiterhelft.
Umlaute im Clienten
01/16/2010 - Metin2 Private Server - 2 Replies
Ich hab mal herumgefragt und herausgefunden dass man die Umlaute im Clienten möglich mach kann. Aber weiß wer wo man die genau ändern kann ?
_ispressed Umlaute
11/24/2009 - AutoIt - 3 Replies
hai ist es möglich mit _isPressed() umlaute ab zu fragen??? hab auf der liste in der Hilfe datei keine gefunden -.- thx für die auskunft
Umlaute in Gegenständen...?
07/10/2006 - WoW Private Server - 2 Replies
Also, ich hab noch nen paar Fragen, wollte nur Edit machen und kein neues Thema dazu aufmachen: 1. Hab ne kleine Frage, also wenn ich Gegenstände oder quests mache, werden die Umlaute (äüö und auch ß auch wenns kein Umlaut is^^) net angezeigt. Weiß einer von ecuh vielleicht, was ich machen kann, damit diese angezeigt werden? Danke schonmal für die Antworten :) 2. Wie kann ich es machen, dass ein Gegenstand nur dropt, wenn man die Quest hat? Hab schon einiges porbiert, aber funzen will...



All times are GMT +2. The time now is 02:32.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.