Input/Output Verwendung des Euro-Zeichens in Java

robinkognito

Mitglied
Hey, ich habe im Rahmen meines Informatik-Studiums einen Programmierkurs mit Java und heute sollten wir eine Klasse anlegen, in der mit Geldwerten gearbeitet wurde. Für die überschriebene toString-Methode, wollte ich das Eurozeichen verwenden, habe jedoch festgestellt, dass es gar nicht korrekt dargestellt wird.

Zuerst sah mein Code wie folgt aus:
Java:
    @Override
    public String toString() {
        if (kontoinhaber == null) {
            return balance + " €";
        }
    return "Kontoinhaber: " + kontinhaber + " " + balance + " €";
    }

In diesem Fall wird das Eurozeichen in der Jshell wie folgt angezeigt:

Java:
jshell> Account test = new Account("Nico");
test ==> Kontoinhaber: Nico 0.0 ?

Also ein Fragezeichen anstelle des Eurosymbols.

Dann habe ich noch zwei weitere Optionen probiert und zwar einmal die String.format()-Version der Dozentin und darüber hinaus den Unicode vom Eurozeichen:

Code:
jshell> System.out.println(String.format("%+.2f€", 3f))
+3,00Ç

jshell> System.out.println("\u20AC")
Ç

Da wird mir in beiden Fällen Ç als Symbol ausgegeben, was aber Cedille und wahrlich kein Eurozeichen ist.

Ich nutze Visual Studio und habe auch hier schon geprüft, welches Encoding eingestellt ist: Default utf8.

Woran könnte das also liegen und wie kann ich es ändern?
 

KonradN

Super-Moderator
Mitarbeiter
Du hast ein Problem mit dem Encoding. Der Java Quellcode liegt in einer Datei, die ein Encoding hat und der Java Compiler liest die Datei unter Verwendung eines Encoding ein. Diese Encodings müssen überein stimmen.

Üblich ist heutzutage, komplett UTF-8 zu verwenden. Wenn Du eine Entwicklungsumgebung wie IntelliJ verwendest, dann sollte die IDE auf das Encoding achten und du kannst es auch festlegen. Unter Windows fand ich Notepad++ ganz gut, um Encodings zu prüfen oder Dateien in ein anderes Encoding zu konvertieren.

Wenn Du manuell übersetzt, dann kannst Du bei javac mit -encoding das Encoding angeben.

Prinzipiell kannst Du das Problem mit dem Encoding der Datei auch umgehen, indem Du keine "Sonderzeichen" verwendest. Die Ascii Zeichen sind in den üblichen Encodings gleich und damit spielt es dann keine Rolle, dass Java Sourcecode und Java Compiler unterschiedliche Encodings haben. In einem String Literal kannst Du Unicode Zeichen per UTF-16 Code angeben. Das wäre für das € Zeichen ein \u20ac.

Sprich die Zeile würde zu return balance + " \u20ac";
 

KonradN

Super-Moderator
Mitarbeiter
Ach so - ich hatte nicht gut genug weiter gelesen - das mit dem \u20ac hast Du ja auch probiert und dabei dann auch Probleme gehabt.

Das Problem kann dann daran liegen, dass eine Diskrepanz gibt zwischen dem Encoding, das für System.out verwendet wird und der Anzeige.

Daher wäre meine Frage noch: Auf welchem System führst Du das wie aus?
 

KonradN

Super-Moderator
Mitarbeiter
Ok, nachdem mir jetzt die zu schnelle Antwort etwas peinlich ist (Dachte, das sei ein typisches Standard-Problem und habe dabei nicht die Fragestellung bis zum Ende gelesen), habe ich mir auch noch die Zeit genommen, es etwas auszutesten.

Auf macos und Linux, auf denen ich meist unterwegs bin, liess sich das Problem nicht nachstellen.

Aber siehe da: Windows 10 mit der Eingabeaufforderung tritt das beschriebene Problem tatsächlich auf. Das Encoding, das die jshell verwendet (UTF-8) wird nicht korrekt angezeigt.

Problem ist die Codepage. Die Codepage ist bei mir (ohne dass ich diese angepasst habe): 850

Ich habe dann einen ersten Test gemacht un die Codepage auf 1252 geändert (chcp 1252) und hatte der jshell dann auch das passende Encoding (windows-1252) mitgegeben: jshell -J-Dfile.encoding=windows-1252:
Das hat dann direkt geklappt.

Aber auch ohne jshell ein anderes Encoding mitzugeben, reicht es, die codepage umzusetzen.

Das sieht dann z.B. so aus:
Code:
C:\Users\xxx>chcp 1252
Aktive Codepage: 1252.

C:\Users\xxx>jshell
|  Willkommen bei JShell - Version 21.0.3
|  Geben Sie für eine Einführung Folgendes ein: /help intro

jshell> System.out.println("\u20ac");
€

jshell>


Die Codepage, die ich eigentlich empfehlen würde, ist eigentlich die 65001 (UTF-8), aber die war auf meinem Windows 10 System nicht vorhanden. Daher probiere einmal ein chcp 65001 aus, ehe Du jshell startest.

Die Codepages für die ISO-8859-x Codepages (28591 für -1 und 28605 für -15) hatten bei mir übrigens auch nicht funktioniert - die gab es zwar, aber da wurde kein Zeichen ausgeben.
 

Oneixee5

Top Contributor
Es sieht wie ein Windows-Problem aus. In ZSH und Bash funktioniert es sofort ohne Einstellungen. Windows habe ich leider nicht um das zu testen.

1716393124166.png
 

DefconDev

Bekanntes Mitglied
Habe es lange nicht mehr probiert aber unter Windows wird wahrscheinlich die cmd aufgerufen und die unterstützt wahrscheinlich immer noch kein utf8 per default.

In der Konsole mal chcp 65001 eingeben oder der Anleitung mal folgen:

Ansonsten die Powershell mal versuchen einzubinden.
 

Robert Zenz

Top Contributor
Um die Erklaerungen von Konrad noch zu ergaenzen, kann ich wieder auf meine Wiederholung zum Thema Strings und Enkodierung verweisen. Eventuell ist auch mein Beispiel fuer das 'analysieren' eines Strings interessant.

Um noch etwas weiter auszuholen was M.L. gesagt hat, du solltest nicht float oder double fuer Geld verwenden, Gleitkommazahlen sind bei Definition ungenau und haben Rundungsfehler welcher sich in der Buchhaltung echt nicht gut machen. Entweder du verwendest int oder long und arbeitest im Cent-Bereich, oder nimmst BigDecimal welches eine arbitraere Genauigkeit (inklusive Optionen fuer das Runden und wie gerundet werden soll) zur Verfuegung stellt.

Ich weisz du bist erst Student, aber das sollte man sich direkt richtig angewoehnen, weil sonst kann es sehr schnell sehr haesslich werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Probleme bei Verwendung short und int im Constuctor Java Basics - Anfänger-Themen 6
T Verwendung jna Java Basics - Anfänger-Themen 15
L Zufälligen Zahlencode, ohne mehrfacher Verwendung einer Ziffer Java Basics - Anfänger-Themen 15
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
b1ck Scanner schließen, erneute Verwendung Java Basics - Anfänger-Themen 12
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
A Verwendung von Interfaces Java Basics - Anfänger-Themen 7
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
G Verwendung von Konstruktor Java Basics - Anfänger-Themen 8
M Verwendung von System.exit(0) problematisch? Java Basics - Anfänger-Themen 1
D native Methoden, Verwendung? Java Basics - Anfänger-Themen 8
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
X Array Ausgabe bei Verwendung von 2 Schleifen erklären Java Basics - Anfänger-Themen 8
G verwendung von regex Java Basics - Anfänger-Themen 3
K Problem bei der Verwendung von Gregorian Calender Java Basics - Anfänger-Themen 3
T NullPointerException bei Verwendung einer Klasse einer anderen .jar datei Java Basics - Anfänger-Themen 3
B Wie wichtig ist Verwendung von StringBuffer in Schleifen? Java Basics - Anfänger-Themen 10
B Verwendung von Arrays Java Basics - Anfänger-Themen 2
U Verwendung von Interface Java Basics - Anfänger-Themen 33
A Methoden Verwendung von crypt? Java Basics - Anfänger-Themen 2
D Muss ich eigentlich immer auf die Verwendung des richtigen Datentyps achten? Java Basics - Anfänger-Themen 7
D reg Exp, verwendung des endezeichen "$" Java Basics - Anfänger-Themen 5
C Verwendung von Schleifen? Java Basics - Anfänger-Themen 18
J Datentypen Array - Verwendung im Konstruktor Java Basics - Anfänger-Themen 8
C Verwendung von primitiven Datentypen Java Basics - Anfänger-Themen 8
J Problem mit NullPointerException bei Verwendung eines Arrays Java Basics - Anfänger-Themen 6
D Frage zur Verwendung einer Schnittstelle Java Basics - Anfänger-Themen 4
A Verwendung von abstrakten Klassen Java Basics - Anfänger-Themen 17
D Verwendung der Klasse Map Java Basics - Anfänger-Themen 9
C Verwendung von Matrizen in einer Schleife Java Basics - Anfänger-Themen 5
F Umlaute eines Strings entfernen (Verwendung von this?) Java Basics - Anfänger-Themen 2
Daniel_L Verwendung von try und catch bei exceptions Java Basics - Anfänger-Themen 7
I Verwendung von Constant Field Values Java Basics - Anfänger-Themen 4
J Verwendung von eigenen Klassen in JSP Java Basics - Anfänger-Themen 2
G try. catch Verwendung Java Basics - Anfänger-Themen 11
Z Beispiel Würfelspiel mit Verwendung von Feldern Java Basics - Anfänger-Themen 7
H Verwendung lokaler Einstellungen Java Basics - Anfänger-Themen 4
G getName, substring Verwendung Java Basics - Anfänger-Themen 3
I Fehler bei Verwendung von substring Java Basics - Anfänger-Themen 4
S Verwendung von Super Java Basics - Anfänger-Themen 7
M Verwendung von Robot... wie? Java Basics - Anfänger-Themen 6
M Verwendung von "this" Java Basics - Anfänger-Themen 2
U Liste importieren und für weitere Verwendung sichern Java Basics - Anfänger-Themen 4
feuervogel Integral unter Verwendung der Java-Bibliothek berechnen Java Basics - Anfänger-Themen 10
frau-u Probleme mit richtiger Verwendung von FileInputStream Java Basics - Anfänger-Themen 2
S valueOf() vs. toString() Verwendung??? Java Basics - Anfänger-Themen 13
A Kurze Frage zur Verwendung von this Java Basics - Anfänger-Themen 9
S Verwendung bitweiser Operatoren Java Basics - Anfänger-Themen 6
F Verwendung von this in statischen Kontext nicht möglich Java Basics - Anfänger-Themen 8
Juelin Sonderzeichen wie Euro (€) Java Basics - Anfänger-Themen 4
K Geldbetrag in Euro + Cents ausgeben Java Basics - Anfänger-Themen 24
V Euro Symbol Problem Java Basics - Anfänger-Themen 2
C DM -> Euro Rechner aber nur mit Operanden des Typs intege Java Basics - Anfänger-Themen 12
M Ausgabe in Euro und Cent Java Basics - Anfänger-Themen 4
M NumberFormat und das Euro-Zeichen Java Basics - Anfänger-Themen 4
N Programm zur Umrechnung von DM auf EURO mit for-Schleife Java Basics - Anfänger-Themen 3
J Euro-DM-Umrechner Java Basics - Anfänger-Themen 2
C Position eines Zeichens in einem String ausgeben Java Basics - Anfänger-Themen 1
T Ändern der Breite eines Zeichens Java Basics - Anfänger-Themen 3
K Alle vorkommen eines Zeichens in StringBuffer Objekt löschen Java Basics - Anfänger-Themen 6
C Vorkommen eines Zeichens zählen Java Basics - Anfänger-Themen 4
I Aufkommen eines be*timmten Zeichens in einem String zählen Java Basics - Anfänger-Themen 13
H Mehrmaliges vorkommen eines Zeichens in einem String Java Basics - Anfänger-Themen 14
J Anzahl eines bestimmten Zeichens in einem String Java Basics - Anfänger-Themen 8
J Überprüfung ersten Zeichens Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben