WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Problem mit Javaprogramm und Unicode (http://www.wcm.at/forum/showthread.php?t=151334)

dietz 25.11.2004 14:35

Problem mit Javaprogramm und Unicode
 
Hallo,
ich komme da nicht weiter.
Ich habe ein Javaprogramm das mir prüft ob die Eingabe des Users ein Buchstabe ist usw.
Also der User gibt in der commandshell einen Buchstaben ein und eine funktion prüft obs ein Buchstabe ist, wenn ja gibt/soll sie True zurückgeben.

static boolean isLetter (char ch){
return (ch == '\u00C4');
}

00c4 ist der hexwert von Ä in unicode.
Gebe ich jetzt aber im Programm ein Ä ein liefert mir die Funktion nicht TRUE.
Mit anderen Zeichen wie { oder ~ funktionierts nicht aber mit den Umlauten (Latin-1 Supplement).
Hat von Euch einer eine Idee warum gerade bei den Umlauten?
Danke!

thyrver 25.11.2004 15:49

also
Code:

return (ch == '\u00C4');
soll 1 zurückliefern, wenn ch dem character von '\u00C4' entspricht. warum geht das nicht einfach mit
Code:

return (ch == "Ä");
?

Vielleicht isses Blödsinn aber das is mir halt spontan dazu eingefallen.

jak 25.11.2004 15:55

Nur zur Info:
Es gibt
Character.isLetter(char c)
Character.isLetterOrDigit(char c)
usw.

Könnte daran liegen, daß Dos die Buchstaben anders kodiert.
Du kannst ja mal probieren, was er da ausgibt:
Code:

static boolean isLetter (char ch){
  System.out.println(ch);
  System.out.println(Character.getValue(ch));
  System.out.println(Character.getNumericValue(ch));
  return Character.getNumericalValue(ch)==196; //dez 196 = hex C4
}

Jak

dietz 25.11.2004 15:57

...ja das habe ich ursprünglich probiert, dabei tritt aber dasselbe Problem auf :-(
Daher dachte ich ich versuchs direkt mit den unicodes, ohne erfolg..

Ich find´s komisch das diese Codezeile mit jedem anderen blöden Zeichen funktioniert, aber nicht mit dem Umlauten.

dietz 25.11.2004 16:10

@jak:
DOS müsste gleich codieren, wenn ich das ä in der commandshell mit alt + 0228 eingeben bekomme ich auch ein ä raus.
Verzwickte Sache!

Ergänzend:
Aufrufen tu ich IsLetter in der main (String [] args) Methode so:
boolean ch1 = UE6_A2_ZeichenOperationen.isLetter(ch);
if (ch1) {
Out.println (" Mein Zeichen '" +ch+ "' ist ein Buchstabe.");
}

jak 25.11.2004 16:14

Was geben meine Codezeilen aus?
Eine boolean Variable ch1 zu nennen ist ungeschickt.
besser wäre entweder
if (UE6_A2_ZeichenOperationen.isLetter(ch)) {
- vielleicht von der lesbarkeit nicht optimal
oder ein Name der auf ein boolean hindeutet wie z.B. isLetter.

Jak

dietz 25.11.2004 16:20

@jak:

Deine Codezeilen kann ich hier nicht ausführen.
Ich benutze für Ein- und Ausgaben zwei Klassen In und Out und compiliere das ganze dann mit der javac.exe des j2sdk1.4.2_04.
Ich kann deinen Code erst am Abend zu Hause testen, mal schauen was ich da rausbekomme.

jak 25.11.2004 16:26

Bei der Antwortgeschwindigkeit entwickelt sich das langsam zu einem Chat ;).

System.out.println() schreibt in den standard Ausgabestream und geht auf JEDER Java VM (übrigens auch der Error Stream - System.err.println())

<edit>
BTW.: Die Klassen aus dem "Sprechen Sie Java" Buch?
</edit>

Jak

dietz 25.11.2004 16:45

@jak: ja das kommt schon nahe an chatten ran! *g*

ok system.out.println funktioniert, aber beim Rest motzt der compiler:
.\UE6_A2_ZeichenOperationen.java:29: cannot resolve symbol
symbol : method getValue (char)
location: class java.lang.Character
System.out.println(Character.getValue(ch));


Damit bekomme ich bei allen Umlauten nur ein ? raus:

static boolean isLetter (char ch){
System.out.println(ch);
}

Alle anderen Zeichen mag er ~, +, ], %, ... Sehr merkwürdig.

P.S. Ich habe die Klassen zwar nicht direkt aus dem Buch, glaube aber es sind die gleichen!

dietz 25.11.2004 17:33

Jetzt wirds mit aber zu bunt!
Wenn ich den eingegebenen Wert als int übernehme bekomme ich für ä 132 raus. Das kann ich auch mit alt + 132 in der commandshell erzeugen.

static boolean isLetter (int ch){
System.out.println(ch);
}

jak 25.11.2004 18:07

Wird wohl der Unterschied zwischen der DOS-Codepage 850 und der Windows Codepage 1252 sein:
DOS: 84h=312d
http://acspro.atari.org/KeyTab/Modern/006005.html
Win-1252 C4h=196
http://acspro.atari.org/KeyTab/Modern/006002.html
(Da kommen Retro Gefühle auf:
mode con codepage prepare=(850) ;))

Eine Lösung für dein Problem kenne ich leider auch nicht. Du könntest die DOS-Zeichen zu den erlaubten zeichen hinzufügen:
Code:

static boolean isLetter(char ch){
return Character.isLetter(char ch) || Character.getNumericValue(char ch)==132 || alle anderen Fälle
}

Die Lösung kann man noch ein bischen eleganter machen:
Code:

static boolean isLetter(char ch){
 int[] dosValues={132,142,148,...};
 int numVal=Character.getNumericValue(char ch);
 boolean isDosChar;
 for (int i=0; i<dosValues.length;i++){
  if(dosValues[i]==numVal){
  isDosChar=true;
  break;
  }
 }
 return isDosChar || Character.isLetter(char ch);
}

Es bleibt aber eher eine Krücke.
Gibt's eigentlich eine Funktion um zu schauen ob ein Element in einem Array enthalten ist? Das würde die for-Schleife sparen.

Jak

dietz 25.11.2004 21:06

Ich befürchte ich muß mit der Krücke leben.
Ja es gibt eine Funktion, die heisst indexOf().
indexOf('n') liefert z.B. das erste Vorkommen von Zeichen n.

Blöd ist das ich die Zeichen auch noch ausgeben muß. Da tu ich mir mit den DOS Codes schwer.
In Out.println kann ich nur Zeichen direkt in Hex- oder Oktalnotation ausgeben, und die Hexnotation von z.B. 132 ist 84 (\u0084 im Code) liefert mir wieder ein ? weil das System dieses nicht erkennt.

Zumindest weiß ich jetzt warum die Zeichen ] ~ usw funktionieren=> weil die alle in der ASCII Codierung vorkommen....hmmm...aber eh die Umlaute auch....*seisehrverwirrt*

Da kommt man manchmal zum verzweifeln...

jak 25.11.2004 21:41

indexOf ist für Strings.

Lösung für's Ausgeben:
Zwei Arrays, wobei im einen die Dos Werte stehen, im anderen die Unicode (an den selben Postionen, also z.B. a[0]=Wert von ä in Dos, b[0]=Wert von ä in Unicode.

Vielleicht findest du bei Google eine bessere Methode, mir fällt im Moment nichts besseres ein.
Code:

static boolean isLetter(char ch){
 int[] dosValues={132,142,148,...};
 int[] unicodeValues={228,...};
 int numVal=Character.getNumericValue(char ch);
 boolean isDosChar;
 char outputChar;
 for (int i=0; i<dosValues.length;i++){
  if(dosValues[i]==numVal){
  isDosChar=true;
    outputChar=unicodeValues[i];
    System.out.println(outputChar);
  break;
  }
 }
 return isDosChar || Character.isLetter(char ch);
}

Jak

Jaguar 26.11.2004 00:27

Wenn du das Java Programm in einer Windows Konsole Eingabeaufforderung laufen hast, dann änder vorher mit:

chcp <codepagenummer>

die Codepage. Das ist eh ein alter Hut das die Eingabeaufforderung bei solch Consolenapplikationen Probleme mit den Sonderzeichen hat.

Also einfach mal vor dem Javaprogramm folgendes eingeben:

chcp 1252

und dann sollest auch in der Console der deutsche Zeichnsatz mit den Umlauten gehen.

Tipp: Im übrigen kann man das mit einer Batch-datei auch automatisieren, die dir vor dem Starten der Java Applikation zuerst mal die Codepage richtig setzt.

midas 28.11.2004 02:00

Code:

public static char readLineNonwhiteChar()
    {
        boolean done = false;
        String inputString = null;
        char nonWhite = ' ';//To keep the compiler happy.

        while (! done)
        {
            inputString = readLine();
            inputString = inputString.trim();
            if (inputString.length() == 0)
            {
                System.out.println(
                                "Your input is not correct.");
                System.out.println("Your input must contain at");
                System.out.println(
                              "least one nonwhitespace character.");
                System.out.println("Please, try again.");
                System.out.println("Enter input:");
            }
            else
            {
                nonWhite = (inputString.charAt(0));
                done = true;
            }
        }

        return nonWhite;
    }

Das hier benutzen wir auf der Uni, hoffe das hilft dir.


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag