'ä' 'ö' 'ü' - Vergleich schlägt fehl
-
Hi folks,
bin mit meinem Latein am Ende. Was mache ich bei folgenden Vergleich falsch?
void convert(StringBuilder buffer, char chr) { if ( buffer.length() > 0 ) { final char letterOne = buffer.charAt(buffer.length() -1); if ( letterOne == 'ü' ) buffer.append('u'); else buffer.append(chr); } else buffer.append(chr); }
chr liefert bei jedem Aufruf von convert() das nächste Zeichen aus folgendem Text:
Ötztürcks Süperspülüng
Warum läuft mein Programm nie in den buffer.append('u');- Zweig?
Danke für alle Antworten!
-
Die Funktion ist so wirr, dass ich ich mir schon gar nicht mehr sicher sein kann, ob sie das machen soll, was ich denke.
Vielleicht ist String.replace() das, was du brauchst.Um herauszufinden, warum deine Funktion nicht geht, solltest du einen Debugger benutzen.
-
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.javaNochmal 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.