# Java und das €urozeichen...



## lukengda (15. Dez 2010)

Hallo zusammen, ich hatte die Aufgabe, bei einer Datei welche ich schreibe die Sonderzeichen richtig anzuzeigen. Ich habe jetzt schon alles geschafft außer das Eurozeichen"€"... ich poste mal beide Versionen. Das Eurozeichen nimmt er nicht als Unicode(\u20AC) oder das Zeichen selber(€(alle anderen Sonderzeichen nimmt er jetzt sofort aus Variablen)) beides geht nicht... jmd eine Idee?

Quellcode aus der Aufgabenstellung:

```
/**
*Ravioli4
*
*Programm berechnet alles rund um Dosen.
*
*Diese Version ist eine benutzerfreundliche Version!
*Rundungen sind auf mm berücksichtigt.
*
*Folgenden Werte werden für eine Tastatur-Eingabe von Umfang und Höhe einer Dose
*berechnet und auf der Konsole UND in einer Datei ausgeben:
*
*• Den Durchmesser des Dosenbodens
*• Die Fläche des Dosenbodens
*• Die Mantelfläche der Dose
*• Die Gesamtfläche der Dose
*• Das Volumen der Dose
*
* @autor: J. M
* @version: 1.0, 16.11.2010
*/

// Import von Java-Klassenbibliotheken
import java.util.*; // für Scanner
import java.io.*;
import java.text.*; // für SimpleDateFormat
import sun.io.*;

public class Ravioli4 {

  //Klassenvariablen
  Scanner sc = new Scanner(System.in); // Scanner-Objekt erzeugen
  // Konstruktor
  public Ravioli4(){
  
    final double PI = 3.141592; // Konstante
    
    // Programmkopf
    System.out.println();
    System.out.println("************************************");
    System.out.println("*                                  *");
    System.out.println("*             Ravioli4             *");
    System.out.println("*      Textdateien verarbeiten     *");
    System.out.println("*                                  *");
    System.out.println("************************************");
    System.out.println("Autor: J. M\n");
    
    // Hinweis
    System.out.println("\nAlle Angaben sind auf mm gerundet!\n");

    // EINGABE
    double u, h;
    String inhalt;

    System.out.print("\nGeben Sie den Umfang der Dose ein [cm]: ");
    u = sc.nextDouble();
    System.out.print("\nGeben Sie die Höhe der Dose ein [cm]  : ");
    h = sc.nextDouble();
    System.out.print("\nGeben Sie den Inhalt der Dose an      : ");
    sc.nextLine(); // Anweisung, um das Prellen der Eingabe zu vermeiden.
    inhalt = sc.nextLine();
    System.out.println();

    // VERARBEITUNG und AUSGABE

    try // try-catch-Block
    {
      String fileName = inhalt + "_" + u + "_" + h + ".txt";
      FileWriter fw = new FileWriter(fileName);
      
      // Zeitstempel ermitteln
      SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
      String datumUhrzeit = sdf.format(new Date());

      // 1. Eintrag in die Datei
      fw.write("Ravioli4\r\n\r\n");
      fw.write("Erstelldatum: " + datumUhrzeit + "\r\n\r\n");
      
      // Ausgabe der Eingabedaten
      fw.write("Eingabedaten:\r\n");
      fw.write("Umfang der Dose: " + (double)Math.round(u*10)/10 + " [cm]\r\n");
      fw.write("Hoehe der Dose : " + (double)Math.round(h*10)/10 + " [cm]\r\n");
      fw.write("Inhalt der Dose: " + inhalt + "\r\n");
      fw.write("\r\n");

      // Ausgabe der berechneten Werte
      String ausgabe = "";
      
      System.out.println("\nBerechnete Werte:\n");
      fw.write("Berechnete Werte:\r\n");

      // Berechnungen:

      // Durchmesser berechnen [Umfang geteilt durch PI]
      double durchmesser = u / PI;
      durchmesser = (double)Math.round(durchmesser * 10) / 10;
      System.out.println("Durchmesser des Dosenbodens : " + durchmesser + "\t[cm]");
      fw.write("Durchmesser des Dosenbodens : " + durchmesser + "\t[cm]\r\n");

      // Fläche des Dosenbodens berechnen [d^2*PI/4 oder d*U/4]
      double flaecheDosenboden = durchmesser*u*PI/4;
      flaecheDosenboden = (double)Math.round(flaecheDosenboden * 10 ) / 10;
      System.out.println("Fläche des Dosenbodens      : " + flaecheDosenboden+ "\t[cm\u00B2]");
      fw.write("Fläche des Dosenbodens     : " + flaecheDosenboden+ "\t[cm\u00B2]\r\n");

      // Mantelfläche der Dose berechnen [Umfang mal Höhe]
      double mantelFlaeche = u * h;
      mantelFlaeche = (double)Math.round(mantelFlaeche * 10 ) / 10;
      System.out.println("Mantelfläche der Dose       : " + mantelFlaeche + "\t[cm\u00B2]");
      fw.write("Mantelfläche der Dose      : " + mantelFlaeche + "\t[cm\u00B2]\r\n");

      // Gesamtfläche berechnen (2 mal Fläche des Dosenbodens plus Mantelfläche)
      double gesamtFlaeche = mantelFlaeche + 2 * flaecheDosenboden;
      gesamtFlaeche = (double)Math.round(gesamtFlaeche * 10 ) / 10;
      System.out.println("Gesamtfläche der Dose       : " + gesamtFlaeche + "\t[cm\u00B2]");
      fw.write("Gesamtfläche der Dose      : " + gesamtFlaeche + "\t[cm\u00B2]\r\n");

      // Volumen der Dose berechnen (Grundfläche mal Höhe)
      double volumen = flaecheDosenboden * h;
      volumen = (double)Math.round(volumen * 10 ) / 10;
      System.out.println("Volumen der Dose            : " + volumen + "\t[cm\u00B3]");
      fw.write("Volumen der Dose            : " + volumen + "\t[cm\u00B3]\r\n");

      fw.close();

      System.out.println("\n\nDie Datei " + fileName +
      " wurde erzeugt und abgelegt.");

      System.out.println("\nDas Programm wurde beendet...\n");
    }
    catch(IOException e)
    {
      System.out.println(e.getMessage());
    }
  }
  //main-Methode
  public static void main (String[] args) {
    new Ravioli4();
  }
}
```


Meine Version:

```
/**
*Ravioli4
*
*Programm berechnet alles rund um Dosen.
*
*Diese Version ist eine benutzerfreundliche Version!
*Rundungen sind auf mm berücksichtigt.
*
*Folgenden Werte werden für eine Tastatur-Eingabe von Umfang und Höhe einer Dose
*berechnet und auf der Konsole UND in einer Datei ausgeben:
*
*• Den Durchmesser des Dosenbodens
*• Die Fläche des Dosenbodens
*• Die Mantelfläche der Dose
*• Die Gesamtfläche der Dose
*• Das Volumen der Dose
*
* @autor: J. M
* @version: 1.0, 16.11.2010
*/

// Import von Java-Klassenbibliotheken
import java.util.*; // für Scanner
import java.io.*;
import java.text.*; // für SimpleDateFormat
import sun.io.*;

public class Ravioli4 {

  //Klassenvariablen
  Scanner sc = new Scanner(System.in); // Scanner-Objekt erzeugen
  // Konstruktor
  public Ravioli4(){
 
    final double PI = 3.141592; // Konstante
   
    // Programmkopf
    System.out.println();
    System.out.println("************************************");
    System.out.println("*                                  *");
    System.out.println("*             Ravioli4             *");
    System.out.println("*      Textdateien verarbeiten     *");
    System.out.println("*                                  *");
    System.out.println("************************************");
    System.out.println("Autor: J. M\n");
   
    // Hinweis
    System.out.println("\nAlle Angaben sind auf mm gerundet!\n");

    // EINGABE
    double u, h;
    String inhalt;

    System.out.print("\nGeben Sie den Umfang der Dose ein [cm]: ");
    u = sc.nextDouble();
    System.out.print("\nGeben Sie die Höhe der Dose ein [cm]  : ");
    h = sc.nextDouble();
    System.out.print("\nGeben Sie den Inhalt der Dose an      : ");
    sc.nextLine(); // Anweisung, um das Prellen der Eingabe zu vermeiden.
    inhalt = sc.nextLine();
    System.out.println();

    // VERARBEITUNG und AUSGABE

    try // try-catch-Block
    {
      String fileName = inhalt + "_" + u + "_" + h + ".txt";
      File f = new File (fileName);
      OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");
      BufferedWriter writer = new BufferedWriter(w);


     
      // Zeitstempel ermitteln
      SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
      String datumUhrzeit = sdf.format(new Date());

      // 1. Eintrag in die Datei
      writer.write("Ravioli4\r\n\r\n");
      writer.write("Erstelldatum: " + datumUhrzeit + "\r\n\r\n");
     
      // Ausgabe der Eingabedaten
      writer.write("Eingabedaten:\r\n");
      writer.write("Umfang der Dose: " + (double)Math.round(u*10)/10 + " [cm]\r\n");
      writer.write("Hoehe der Dose : " + (double)Math.round(h*10)/10 + " [cm]\r\n");
      writer.write("Inhalt der Dose: " + inhalt + "\r\n");
      writer.write("\r\n");

      // Ausgabe der berechneten Werte
      String ausgabe = "";
     
      System.out.println("\nBerechnete Werte:\n");
      writer.write("Berechnete Werte:\r\n");

      // Berechnungen:

      // Durchmesser berechnen [Umfang geteilt durch PI]
      double durchmesser = u / PI;
      durchmesser = (double)Math.round(durchmesser * 10) / 10;
      System.out.println("Durchmesser des Dosenbodens : " + durchmesser + "\t[cm]");
      writer.write("Durchmesser des Dosenbodens : " + durchmesser + "\t[cm]\r\n");

      // Fläche des Dosenbodens berechnen [d^2*PI/4 oder d*U/4]
      double flaecheDosenboden = durchmesser*u*PI/4;
      flaecheDosenboden = (double)Math.round(flaecheDosenboden * 10 ) / 10;
      System.out.println("Fläche des Dosenbodens      : " + flaecheDosenboden+ "\t[cm\u00B2]");
      writer.write("Fläche des Dosenbodens     : " + flaecheDosenboden+ "\t[cm²]\r\n");

      // Mantelfläche der Dose berechnen [Umfang mal Höhe]
      double mantelFlaeche = u * h;
      mantelFlaeche = (double)Math.round(mantelFlaeche * 10 ) / 10;
      System.out.println("Mantelfläche der Dose       : " + mantelFlaeche + "\t[cm\u00B2]");
      writer.write("Mantelfläche der Dose      : " + mantelFlaeche + "\t[cm\u00B2]\r\n");

      // Gesamtfläche berechnen (2 mal Fläche des Dosenbodens plus Mantelfläche)
      double gesamtFlaeche = mantelFlaeche + 2 * flaecheDosenboden;
      gesamtFlaeche = (double)Math.round(gesamtFlaeche * 10 ) / 10;
      System.out.println("Gesamtfläche der Dose       : " + gesamtFlaeche + "\t[cm\u00B2]");
      writer.write("Gesamtfläche der Dose      : " + gesamtFlaeche + "\t[cm\u00B2]\r\n");

      // Volumen der Dose berechnen (Grundfläche mal Höhe)
      double volumen = flaecheDosenboden * h;
      volumen = (double)Math.round(volumen * 10 ) / 10;
      System.out.println("Volumen der Dose            : " + volumen + "\t[cm\u00B3]");
      writer.write("Volumen der Dose            : " + volumen + "\t[cm\u00B3]\r\n");

      writer.close();

      System.out.println("\n\nDie Datei " + fileName +
      " wurde erzeugt und abgelegt.");

      System.out.println("\nDas Programm wurde beendet...\n");
    }
    catch(IOException e)
    {
      System.out.println(e.getMessage());
    }
  }
  //main-Methode
  public static void main (String[] args) {
    new Ravioli4();
  }
}
```


----------



## Haave (15. Dez 2010)

Wo in deinem Code verwendest du denn "€" bzw. "\u20AC"? Hab mir den Code angeschaut, aber das Zeichen wird da nirgendwo verwendet. Gibt es eine Fehlermeldung vom Compiler? Falls es sich kompilieren lässt: Was macht dein Programm, wenn das Euro-Zeichen drin steht? Testausgaben usw.?


----------



## lukengda (15. Dez 2010)

naja, also meinem Lehrer und jetzt auch mir ging es um eine Nachhaltige Lösung, und das Eurozeichen ist das Einzigste, was ich noch nicht geschafft habe. Außerdem übernimmt das Programm eine Variable in die Datei, da könnte ja theoretisch auch ein € drinne sein. Also in der Konsole gibt ein "€" ein"?" in der Datei verändert sich nichts, also ""


----------



## Haave (15. Dez 2010)

Kannst du das relevante Codestück zeigen (oder habe ich es übersehen?)?


----------



## XHelp (15. Dez 2010)

Wenn du schon alles in der Variable vermutest, dann darfst du es auch nicht als Dateiname verwenden.
Bist du sicher, dass es nicht an deinem Texteditor liegt?


----------



## SlaterB (15. Dez 2010)

es geht wohl um die System.in-Eingabe, auf die Schnelle habe ich es da auch nicht geschafft, ein € einzulesen, unter Eclipse-Konsole, 
Windows-Eingabeaufforderung zeigt ja selber nur ein Fragezeichen an wenn man € eintippt..


```
public class Test {
    public static void main(String[] args)   throws Exception  {
        String inhalt;
        System.out.print("Eingabe: ");
        InputStreamReader in = new InputStreamReader(System.in, "UTF-8"); // oder Scanner?
        BufferedReader bin = new BufferedReader(in);
        inhalt = bin.readLine();
        System.out.println(inhalt + ", " + inhalt.length());
        inhalt = "€";
        System.out.println(inhalt + ", " + inhalt.length());
    }
}
```

wenn \u20AC in der Konsole eingetippt wird, dann kommt das als sechs verschiedene Zeichen an, dann muss man die letzten 4 herausfiltern, zu einer Zahl parsen und diese als char verwenden..


----------



## maki (15. Dez 2010)

cmd.exe spricht kein utf-8, das wird schwierig


----------



## Gastredner (15. Dez 2010)

maki hat gesagt.:


> cmd.exe spricht kein utf-8, das wird schwierig


Gibt es eigentlich irgendeinen vernünftigen Grund dafür, dass MS immer noch nicht auf Unicode/UTF-8 umgestellt hat?


----------



## XHelp (15. Dez 2010)

Lässt es sich nicht mit 
	
	
	
	





```
chcp 65001
```
 einstellen?


----------



## maki (15. Dez 2010)

Gastredner hat gesagt.:


> Gibt es eigentlich irgendeinen vernünftigen Grund dafür, dass MS immer noch nicht auf Unicode/UTF-8 umgestellt hat?


Die PowerShell kann utf-8, cmd.exe (deutsche Windowsinstallation) nutzt CP850, kann mit [c]chcp[/c] abgefragt/verändert werden, man hat schon ein paar Zeichensätze zur Auswahl, aber utf-8 ist AFAIK nicht dabei.

Nachtrag:


XHelp hat gesagt.:


> Lässt es sich nicht mit
> 
> 
> 
> ...


Hast recht, wenn als Schriftart Lucida Console angegeben wird, kann ich ein € in die Konsole tippen.


----------



## bandy (15. Dez 2010)

Vielleicht hilft das hier?:bahnhof:

http://www.java-forum.org/java-basics-anfaenger-themen/98824-ausgabe-eingabeaufforderung-ueber-system-out-println-fremdsprachen-andere-kodierung.html


----------

