Was mache ich da falsch ?
Danke für euere Antworten im Voraus und einen schönen Tag
Viele Grüße Wolfgang
ich kann Dir auch nicht bei Deinen Server-Problemen helfen. Aber ich
vermeide diesen ganzen Kodierungswahnsinn, indem ich Unicode verwende.
Das hat zwar den kleinen nachteil, daß man den Text nicht mehr so schön
lesen kann. Dafür aber fuunktioniert es einfach.
Dein Progrämmchen sieht dann übrogens so aus:
public class Umlaute {
public static void main(String[] args)
{
System.out.println("\u00e4\u00e4\u00e4\u00f6\u00f6\u00f6\u00fc\u00fc\u00fc");
}
}
Die Codetabellen gibt es bei www.unicode.org
Paul
Hallo Wolfgang,
das Thema hatten wir vor einiger Zeit schonmal hier. Werfe doch
mal Google an.
Meine Idee: Der Zeichensatz deines Editors passt nicht zum
Zeichensatz des Compilers oder der Laufzeitumgebung:
1.) Mit -encoding beim Aufruf von javac den Zeichensatz deines
Editors angeben, oder
2.) die Umlaute in der Zeichenkette direkt als Unicode-Zeichen
angeben oder
3.) den Zeichensatz deines Editors ändern.
Mir persönlich gefällt 2.) am besten, da man damit
von irgendwelchen Zeichensatzproblemen gänzlich befreit ist.
Es könnte allerdings auch sein, dass die Zeichensätze in
einer deiner Laufzeitumgebungen nicht passen, d.h.
die JVM verwendet einen anderen Zeichensatz als dein
BS.
ciao
Marcus
wolfgang
> Eigentlich gehts hier um ein Servlet, das auf einer anderen Maschine entwickelt
> wird.
Verwendest Du auch in beiden Fällen denselben Browser? Vergleiche doch
mal die http-Konversation, insbesondere den Komplex um die accept-*
Header.
Das kannst Du zum Beispiel mit der Mozilla-Erweiterung LiveHTTPHeaders.
Mir hat das schon ein paarmal die Augen geöffnet.
Ciao, MM
--
Marian Aldenhövel, Rosenhain 23, 53123 Bonn.
Fon +49 228 624013, Fax +49 228 624031.
http://www.marian-aldenhoevel.de
"nothing ever rolls and nothing ever rocks and
nothing's ever worth the cost"
> Um zu testen welche JavaVersion Umlaute darstellen kann habe ich dieses
> kleine Programm geschrieben .
> public class Umlaute {
> public static void main(String[] args)
> {
> System.out.println("äääöööüüü");
> }
> }
> Mit der ersten Version kommen die Umlaute, die zweite liefert ????.
Nur vier Fragezeichen?
Hast du zwischendurch neukompiliert?
Was hier ausgegeben wird, hängt
(a) von der Einstellung der Konsole/des Terminals ab,
in dem du arbeitest,
(b) von der System-Property file.encoding.
(c) vom Encoding des Editors, in dem du die Datei speicherst
(d) vom Encoding des Compilers, mit dem du die Datei kompilierst.
(a) und (b) sowie (c) und (d) sollten jeweils auf das
gleiche eingestellt werden (und die Konsole sollte
fähig sein ...).
Mit der Darstellung in Webseiten hat (a) und (b) übrigens
nichts zu tun, dagegen (c) und (d) schon. Hier ist auch
noch wichtig, dem Browser gas gleiche zu geben, wie man
behauptet, zu geben.
HTH
Paul
> das Thema hatten wir vor einiger Zeit schonmal hier. Werfe doch
> mal Google an.
>
> Meine Idee: Der Zeichensatz deines Editors passt nicht zum
> Zeichensatz des Compilers oder der Laufzeitumgebung:
>
[...]
> 2.) die Umlaute in der Zeichenkette direkt als Unicode-Zeichen
> angeben oder
[...]
> Mir persönlich gefällt 2.) am besten, da man damit
> von irgendwelchen Zeichensatzproblemen gänzlich befreit ist.
Und wenn man es bequemer haben will, kann man "normal tippen",
und nachher native2ascii (ist in jedem JDK dabei) benutzen.
Paul
wo hast du es compiliert? Nur einmal und dann das Class File getestet?
> Mit der ersten Version kommen die Umlaute, die zweite liefert ????.
Also entweder beim compilieren hat der javac Probleme den Zeichensatz der
Quelldatei falsch verstanden zu haben (schreib sie in UTF-8 und gib es an
(-encoding=UTF-8), oder bei der Ausgabe ist das Terminal in (z.b) UTF8 mode
und die VM weiss das nicht. Schau mal nach den Einstellungen von LANG und
LC_
Gruss
Bernd
--
eckes privat - http://www.eckes.org/
Project Freefire - http://www.freefire.org/
Schöne Grüße,
Wolfgang
Danke Wolfgang
Schöne Grüße Wolfgang
Wolfgang
>
> Wolfgang
wolfgang
[snip]
> Auf dem Webserver mit Suse 8.1 glaube ich langsam, das es eine
> Einstellungsfrage von Tomcat ist.
[snip]
Ich starte meinen Tomcat mit folgender JVM-Parameter:
JAVA_OPTS="-Dfile.encoding=ISO8859_1 -Xms256m -Xmx512m
-Djava.awt.headless=true"
Wenn du es auf UTF änderst, vielleicht hilft es.
Gruß Frank
Schöne Grüße,
Wolfgang
Entschuldige, aber in deinem Orginalpost ging es um source der ein
System.out verwendet, inzwischen bist du bei kaputten Umlauten in
Datenbanken (über den Umweg mit kaputten Umlauten in Servlets). Ich würde
dir empfehlen mal bei einem Problem zu bleiben. Hast du das javaprogramm mit
-encoding compiliert und dir die ausgabe mal mit "od -x" angesehen? Solange
-das nicht tut wuerde ich alles andere erst mal liegen lassen. Die
-Verwendung von expliziten unicode sequenzen kann auch helfen dein Problem
-zu debuggen.
>
> Gruss
> Bernd
Grüsse
Wolfgang
Na also, dann ist dein Problem im encoding der source files.
> Was mir nicht klar ist, wie wichtig sind Apace Einstellungen für Tomcat.
Fuer das Testprogramm garnicht. :)
> Wolfgang Herfter <her...@ypso.org> wrote:
>> Wenn ich diese einsetze, dann werden die Umlaute richtig dargestellt.
>
> Na also, dann ist dein Problem im encoding der source files.
Entschuldige bitte, aber ich stehe total auf dem Schlauch. Wieso ????
Es wird doch das Class File ausgeführt oder ??? Und im Source wird doch nur
gesagt, printe die Umlaute aus. Bisher dachte ich immer das es am System
liegt, was da dann für Zeichen kommen.
Offensichtlich ist das Falsch.
> Gruss
> Bernd
Grüsse
Wolfgang
> Bernd Eckenfels wrote:
>
>
>>Wolfgang Herfter <her...@ypso.org> wrote:
>>
>>>Wenn ich diese einsetze, dann werden die Umlaute richtig dargestellt.
>>
>>Na also, dann ist dein Problem im encoding der source files.
>
> Es wird doch das Class File ausgeführt oder ??? Und im Source wird doch nur
> gesagt, printe die Umlaute aus.
Nein, im Source-File stehen ausserdem auch noch die Umlaute selbst drin.
Ein File besteht aber ja nur aus Bytes, also "Zahlen". Welche Zahl nun
welchem Buchstaben entspricht, ist eine reine Interpretationsfrage. Du
musst dem Compiler, der ja das Source-File erstmal einliest, sagen, wie
er die Zahlen zu interpretieren hat. Erst dann kann er es richtig lesen,
und ein entsprechendes Class-File erzeugen (in dem dann auch wieder die
Umlaute drinstehen - diesmal aber durch anderne Zahlen repräsentiert).
Entspricht die Interpretation der Zahlen im Source-File durch den
Compiler nicht der Deinen, bzw. der Deines Editors, kommt es zum
beobachteten Effekt.
Warum es mit Unicode-Zeichen funktioniert, liegt daran, dass diese im
Sourcecode aus den Zeichen '\' und '0'-'9' bestehen, für die es im
allgemeinen weit weniger Interpretationsvarianten gibt als für Umlaute.
Klingt komisch, ist aber so.
Bye
Achim
Und wie versuchst du diese darzustellen? HTML kann ohne Probleme
Unicode-Zeichen darstellen. Dazu musst du noch nichtmal UTF-8 als
Charset verwenden oder so ...
Stelle einfach alle Zeichen mit einem Code >127 durch eine &#xxx;
Sequenz dar, wobei xxx die Nummer des Unicode-Zeichens ist.
Beispiel:
char c = 'ö';
String html = "&#"+c+";";
> Um zu testen welche JavaVersion Umlaute darstellen kann habe ich dieses
> kleine Programm geschrieben .
> public class Umlaute {
> public static void main(String[] args)
> {
> System.out.println("äääöööüüü");
> }
> }
Dein Test-Programm ist schlecht gewählt. Da du die Umlaute direkt in den
Quellcode schreibst, werden sie Eventuell von dem Compiler vermurkst.
Der Compiler und dein Editor müssen mit dem selben Charset arbeiten.
Besser wäre es, datt dem Umlaut "ö" einfach mal "\xF8" zu schreiben.
(Ich glaube ein ö ist F8, bin mir recht sicher, aber nicht ganz).
Außerdem schreibst du mit System.out auf die Console. Hier werden die
Unicodezeichen z.B. nach ISO-8859-1 konvertiert usw.
Nicht immer - z.B. unter Windows - wählt die JVM das richtige Charset.
> Was mache ich da falsch ?
Du musst dich intensiv damit auseinandersetzen, wann, wie und warum von
diversen Charsets nach Unicode und zurück konvertiert wird. Am besten
ist allerdings, jede Konvertierung zu vermeiden. Bei HTML ist das sehr
einfach. Entweder produziert man UTF-8 Webseiten, oder man verwendet
obige &#xxx;-Syntax für Zeichen jenseits der ASCII-Tabelle (das sind
genau die >127).
HTML/HTTP bieten aber auch Fallen. Man kann das Charset sowohl im
Content-Type HTTP-Header angeben, aber auch im HTML-Code als meta-Tag.
Informationen über das verwendete Charset gibt dir der Menüpunkt "Page
Info" in Mozilla und Firefox.
Einen schönen Tag noch zusammen.
Bis demnächst
wolfgang
> > Auf meinem Webserver (Suse 8.1) gelingt es mir nicht Umlaute unter der
> > Tomcat 5.0.27 darzustellen.
>
> Und wie versuchst du diese darzustellen? HTML kann ohne Probleme
> Unicode-Zeichen darstellen. Dazu musst du noch nichtmal UTF-8 als
> Charset verwenden oder so ...
>
> Stelle einfach alle Zeichen mit einem Code >127 durch eine &#xxx;
> Sequenz dar, wobei xxx die Nummer des Unicode-Zeichens ist.
>
> Beispiel:
> char c = 'ö';
> String html = "&#"+c+";";
Naja - "&#"+(int)c+";" wäre richtiger.
> > Um zu testen welche JavaVersion Umlaute darstellen kann habe ich dieses
> > kleine Programm geschrieben .
> > public class Umlaute {
> > public static void main(String[] args)
> > {
> > System.out.println("äääöööüüü");
> > }
> > }
>
> Dein Test-Programm ist schlecht gewählt. Da du die Umlaute direkt in den
> Quellcode schreibst, werden sie Eventuell von dem Compiler vermurkst.
> Der Compiler und dein Editor müssen mit dem selben Charset arbeiten.
> Besser wäre es, datt dem Umlaut "ö" einfach mal "\xF8" zu schreiben.
> (Ich glaube ein ö ist F8, bin mir recht sicher, aber nicht ganz).
In Java schreibt man \u00F6. (F8 ist ø.)
Alternativ \370 (oktal).
Paul
> > (a) und (b) sowie (c) und (d) sollten jeweils auf das
> > gleiche eingestellt werden (und die Konsole sollte
> > fähig sein ...).
>
> Dem ist so.
>
> > Mit der Darstellung in Webseiten hat (a) und (b) übrigens
> > nichts zu tun, dagegen (c) und (d) schon. Hier ist auch
>
> (d) war mir neu. Da ich mit Netbeans arbeite war das ein wirklich guter
> Hinweis. Jetzt werden die Mails mit Umlaute verschickt, aber noch nicht
> angezeigt bzw. sie werden nicht mit Umlaute empfangen.
Wie erstellst du die E-Mails?
(Wichtig: Wie kommt der Text in die E-Mails?)
> Da sind schon im
> Logfile mit ??? versehen.
Wie schreibst du ins Logfile?
Versuche mal, im Quelltext die \uxxxx-Notation zu verwenden?
Damit schließt du wenigstens eine Fehlerquelle aus.
\u00e4 = ä
\u00c4 = Ä
\u00f6 = ö
\u00d6 = Ö
\u00fc = ü
\u00dc = Ü
\u00df = ß
> > noch wichtig, dem Browser gas gleiche zu geben, wie man
> > behauptet, zu geben.
>
> Was meinst Du damit ? Ich habe auf meiner Website den Eintrag
> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
Und wie gibst du die Daten aus?
Paul
(OK, einige der Fragen sind schon in den anderen Beiträgen
des Threads diskutiert ...)
PS: Wenn du beim Antworten immer eine Leerzeile zwischen
deinem Beitrag und dem Zitat lässt, wird es leichter lesbar.
> > Solange -das nicht tut wuerde ich alles andere erst mal liegen lassen. Die
> > -Verwendung von expliziten unicode sequenzen kann auch helfen dein Problem
> > -zu debuggen.
>
> Wenn ich diese einsetze, dann werden die Umlaute richtig dargestellt.
Dann haben wir den (oder zumindest einen) Verursacher gefunden.
Mach mal
System.out.println("\u00e4 = ä");
System.out.println("\u00c4 = Ä");
System.out.println("\u00f6 = ö");
System.out.println("\u00d6 = Ö");
System.out.println("\u00fc = ü");
System.out.println("\u00dc = Ü");
System.out.println("\u00df = ß");
und variiere so lange die Einstellungen des Editors
und des Compilers (-encoding), bis jeweils das gleiche
ausgegeben wird.
(Eine Begründung hat ja Achim schon gegeben.)
Paul
Ups, und ich wollte erst noch ...