Sonderzeichen aus Datei einlesen und in Datei ausgeben.

Ratte78

Mitglied
Hallo Leute,

vorab: Ich möchte nichts weiter tun als eine .csv Datei einzulesen, die Daten zu konvertieren und in eine .csv-Datei wieder auszugeben. Hab da aber Probleme mit Sonderzeichen. Insbesondere "µ".
Die Eingagsdatei wird aus Excel exportiert. Hat also als Zeichensatz vermutlich Cp1252.
Ich lese die ein mit org.apache.commons.csv. Mit Angabe der Codierung:
java:
FileInputStream is = new FileInputStream(IN_CSV_FILE_PATH);
Reader in = new InputStreamReader(new BOMInputStream(is), "UTF-8"); //aus Excel als csv-UTF-8 exportiert mit einlesen mit BOM per org.apache.commons.io.input.BOMInputStream
CSVFormat fmt = CSVFormat.EXCEL.withFirstRecordAsHeader().withRecordSeparator(';').withDelimiter(delimiter)
.withQuote('"').withQuoteMode(QuoteMode.NON_NUMERIC); // delimiter ist ";" oder ","
Iterable<CSVRecord> records = fmt.parse(in);
int rows = 0;
for (CSVRecord record : records) {
rows++;
... Hier erfolgt die Konvertierung
... Ausgabe:
wurde folgendermasen definiert:
pwr = new OutputStreamWriter(new FileOutputStream(OUT_CSV_FILE_PATH), "Cp1252");

usw.

In der Eingangsdatei wird das "µ" korrekt angezeigt. Aber irgendwie kann es von Java nicht korrekt eingelesen oder ausgegeben werden.
Meines Wissens wandelt java alles erstmal nach unicode um und dann wieder zurück. Im unicode ist das Zeichen aber def. enthalten.
Ich hab keine Ahnung was ich falsch mache.
Ich hoffe auf eure Hilfe. Und bedanke mich bereits im vorraus.

Gruß
Ratte

ps: Das mit der Code-Definition hab ich nicht verstanden. Also wenn mir da schon mal jemand helfen könnte? :cool:
 

ratte7870

Neues Mitglied
Servus Robert,

danke für deine Antwort.
Ich hab mich aber unklar ausgedrückt: Ich hab zuerst versucht die Datei aus Excel als CSV zu exportieren(Ist dann Cp1252). Dann wird das Mühselige "µ" auch im Texteditor angezeigt. Aber beim einlesen und dann ausgeben(als Cp1252) wird das "µ" zu "?". Habs dann mit Export von Excel als CSV-UTF8 probiert. Deswegen auch dann mit BOMInputStream eingelesen. Beim ausgeben als UTF-8 wird aus dem ? eine wirre Zeichenfolge.

Ganz sicher fehlt es mir an Information oder ich versteh irgendwas falsch.
Irgend eine Idee?

Danke
 

Neumi5694

Top Contributor
Mach die Datei mal in Notepad++ auf, da kannst du schnell den Zeichensatz ändern. Wenn du einen findest, mit dem's klappt, dann verwende den in Java zum Einlesen.
 

Robert Zenz

Bekanntes Mitglied
Ich hab zuerst versucht die Datei aus Excel als CSV zu exportieren(Ist dann Cp1252). Dann wird das Mühselige "µ" auch im Texteditor angezeigt. Aber beim einlesen und dann ausgeben(als Cp1252) wird das "µ" zu "?".
Ja, dann musst du in Java auch "CP1252" als Charset angeben.
Habs dann mit Export von Excel als CSV-UTF8 probiert. Deswegen auch dann mit BOMInputStream eingelesen. Beim ausgeben als UTF-8 wird aus dem ? eine wirre Zeichenfolge.
Dein Text-Editor ist ein Arsch und zeigt dir UTF-8 Dateien als CP-1252 an. Zur Erklaerung, bei UTF-8 ist alles oberhalb von 128(?) als Zwei-Byte-Sequenz dargestellt. also ein "ü" braucht zwei Bytes in UTF-8, das erste gibt die Codepage an, das zweite das Zeichen in dieser Codepage.

Das Thema Enkodierung ist etwas leidig, du brauchst einen Text-Editor welcher es dir erlaubt zwischen den Enkodierungen umzuschalten in der Datei welche du gerade betrachtest (das ist so ziemlich jeder, mit Ausnahme Notepad natuerlich). So einer wie Notepad++ oder Geany zum Beispiel. Erst dann kannst du wirklich anfangen "richtig" zu pruefen was deine Java Logik macht.
 

Jw456

Top Contributor
hier etwas was eine datei im cp1252 liest und als utf8 speichert.

Java:
public static void main(String[] args) throws Exception
    {
        File file = new File("test.txt");
        File file2 =new File("test2.txt");
        StringBuilder builder = new StringBuilder();

        Reader reader = new InputStreamReader(new FileInputStream(file), "windows-1252");
        while (reader.ready())
        {
           char ch = (char) reader.read();
           builder.append(ch);
        }
        reader.close();

        String string = builder.toString();
             
        Writer writer = new OutputStreamWriter(new FileOutputStream(file2), "UTF8");
        writer.write(string);
        writer.flush();
        writer.close();
    }
 
Zuletzt bearbeitet:

Ratte78

Mitglied
Morgen Leute.
Vielen Dank für eure Antworten. Werde die Datei mal mit Notepad++ bzw. einem Hex-Editor prüfen.
Derweil hab ich das Programm in Eclipse debugged und mir das entsprechende Feld im Debugger angesehen. Passt: µ = µ.
Ein System.out.println bringt im Console-Window aber wieder nur ein "?". So wird es auch in die Ausgangsdatei geschrieben.
Ein System.out.println("µ") funktioniert allerdings.Der Eclipse-Editor ist auf Cp1252 eingestellt.
Ich bin völlig verwirrt.
Gruß Ratte
 

Neumi5694

Top Contributor
Morgen Leute.
Vielen Dank für eure Antworten. Werde die Datei mal mit Notepad++ bzw. einem Hex-Editor prüfen.
Derweil hab ich das Programm in Eclipse debugged und mir das entsprechende Feld im Debugger angesehen. Passt: µ = µ.
Ein System.out.println bringt im Console-Window aber wieder nur ein "?". So wird es auch in die Ausgangsdatei geschrieben.
Ein System.out.println("µ") funktioniert allerdings.Der Eclipse-Editor ist auf Cp1252 eingestellt.
Ich bin völlig verwirrt.
Gruß Ratte
Der Zeichensatz des Editors in Eclipse ist irrelevant. Der besagt nur, in welchem Zeichensatz dein Quellcode gespeichert wird, das hat nichts mit irgendwelchen Ein- oder Ausgabedateien zu tun (hier verwende ich mittlerweile grundsätzlich UTF-8, da wir auf verschiedenen Systemen arbeiten).

Was ist ein "Feld" in Eclipse? Wenn das Zeichen im Java-String richtig gespeichert ist, dann hat das Einlesen richtig funktioniert.

Was die Ausgabe betrifft, führe mal bitte diesen Code aus:
Java:
    public static void main(String[] args) {
        System.out.println("µ");
    }

Kommt das Zeichen richtig auf der Konsole an?
Falls ja, dann wurde die Datei wohl doch nicht korrekt eingelesen.
Falls nein, dann hast du ein Problem mit dem Zeichensatz deiner Konsole.
Überprüf gegebenenfalls auch mal den Zahlenwert des Characters (Fisch dir das Zeichen mit charAt() raus und lass es als Int ausgeben).

Hier fehlen leider doch ein paar Informationen bezüglich der Umsetzung. Ein geht/geht nicht sagt nicht wirklich viel aus.
Mit welchem Charset hast du die Quelldatei eingelesen?
Mit welchem Charset hast du die Zieldatei geschrieben?
Poste eventuell doch auch einfach mal den Code für's Einlesen (in Code Tags bitte).
 

Jw456

Top Contributor
Cp1252 wie in Windows benutzt wird ist ein 8 Bit Zeichen Code. (256 Zeichen theoretisch möglich)
Die ersten 127 Zeichen entsprechen den Ansi ASCII Code danach kommt die Codepage .
Dein „µ“ hat da den Code Hex 0xB5 Dezimal 181.



UTF 8 ist ein 16 Bit Zeichen Code. (65536 Zeichen theoretisch möglich)
Die ersten 127 Zeichen sind auch wider Ansi ASCII Code
Von 0x80 bis 0xBF ist frei wird mit meistens mit „?“ oder einen anderen Symbol oft ein kleines Quadrat angezeigt.
Dein „µ“ hat bei UTF8 0xC2B5 in hex


In Java hat ein Zeichen immer 16 Bit .
Deshalb caste ich auch das Byte was vom Reader gelesen wird zu Char 16 Bit.
 

Neumi5694

Top Contributor
Das Fragezeichen hat noch irgendwo in meinem Hinterkopf rumort. Hab das mal getestet.
Dafür habe ich testweise eine ANSI und eine UTF-Datei mit je einer Zeile "µ" erstellt, ein Fragezeichen kam nie auf der Konsole an.

Java:
    public static void main(String[] args) {
        System.out.println("µ");
        try {
            for (String charsetname : Arrays.asList("windows-1252", "utf-8")) {
                for (String filename : Arrays.asList("e:\\my_ansi.txt", "e:\\my_utf.txt")) {
                    System.out.printf("Reading '%s' with charset '%s': ", filename, charsetname);
                    try ( var r = new BufferedReader(new FileReader(filename, Charset.forName(charsetname)))) {
                        System.out.println(r.readLine());
                    }
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(MyOhMy.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
Ausgabe:
Code:
µ
Reading 'e:\my_ansi.txt' with charset 'windows-1252': µ
Reading 'e:\my_utf.txt' with charset 'windows-1252': µ
Reading 'e:\my_ansi.txt' with charset 'utf-8': �
Reading 'e:\my_utf.txt' with charset 'utf-8': µ

Kann es sein, dass dein CSVFormat hier was verfälscht? An welchem Punkt hast du debugt?
 

Jw456

Top Contributor
Das Fragezeichen hat noch irgendwo in meinem Hinterkopf rumort. Hab das mal getestet.
Dafür habe ich testweise eine ANSI und eine UTF-Datei mit je einer Zeile "µ" erstellt, ein Fragezeichen kam nie auf der Konsole an.


[/CODE]
Ausgabe:
Code:
µ
Reading 'e:\my_ansi.txt' with charset 'windows-1252': µ
Reading 'e:\my_utf.txt' with charset 'windows-1252': µ
Reading 'e:\my_ansi.txt' with charset 'utf-8': �
Reading 'e:\my_utf.txt' with charset 'utf-8': µ
das "?" wird von einigen Editoren angezeigt wenn zum Beispiel er ein Zeichen im Utf8 Zeichensatz erwartet aber es im cp1252 ist. Denn das 0xB5xx gibt es im UTF8 Zeichensatz nicht also fügt der Editor einen Platzhalter dafür ein. Einige benutzen halt das „?“
 

Neumi5694

Top Contributor
das "?" wird von einigen Editoren angezeigt wenn zum Beispiel er ein Zeichen im Utf8 Zeichensatz erwartet aber es im cp1252 ist. Denn das 0xB5xx gibt es im UTF8 Zeichensatz nicht also fügt der Editor einen Platzhalter dafür ein. Einige benutzen halt das „?“
Ja, aber er hat gesagt, es wäre auf der Konsole ausgegeben worden.
 

Jw456

Top Contributor
Zum Thema System.out.printl
Dann schaut euch doch mal an welchen Zeichensatz die Konsole Standard mäßig benutzt.
Dann stellt doch mal die Ausgabe auf einen andren Zeichensatz um.

Java:
 System.out.println("schönes München");
            System.setOut(new PrintStream(
                    new FileOutputStream(FileDescriptor.out),true,"CP850"));
 System.out.println("schönes München");


und schaut euch die Ausgabe an.

schönes München
sch�nes M�nchen
 

Neumi5694

Top Contributor
Zum Thema System.out.printl
Dann schaut euch doch mal an welchen Zeichensatz die Konsole Standard mäßig benutzt.
...
Verdammt, Denkfehler meinerseits, hab den Output in der IDE geprüft und nicht in einem DOS-Fenster.
Dass die ISO850 verwenden, weiß ich, seit ich Batch-Dateien bei einem norwegischen Kunden erstellen musste.

Dann hat sich meine Überlegung wohl erübrigt.
 

Ratte78

Mitglied
Konsolen-Anwendung (insbesondes unter Windows) war auch für mich neu. Hab den Zeichensatz per: System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out), true, "CP850")); angepasst.

Aber hab Dank für deinen Beitrag. Deine Überlegungen sind keineswegs vergebens. Irgendwann wird irgendwer über diesen Post stolpern und bekommt einen neuen Denkanstoß.

Also: Weiter so ........
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N iText keine Sonderzeichen und Umlaute unter Windows Allgemeine Java-Themen 13
J Sonderzeichen für Griechisch Allgemeine Java-Themen 2
E Sonderzeichen nicht setzbar: Großes Problem bei Programmierung unter Linux Mint mit Virtual Box Allgemeine Java-Themen 5
M Sonderzeichen Dateiname Allgemeine Java-Themen 18
A Bestimmte Sonderzeichen im Regulären Ausdruck Allgemeine Java-Themen 2
W Sonderzeichen DACH ^ Allgemeine Java-Themen 6
M Kommandozeile und Sonderzeichen Allgemeine Java-Themen 2
A Input/Output Serialisierung Sonderzeichen Allgemeine Java-Themen 3
S Zu .txt inklusive Sonderzeichen Allgemeine Java-Themen 3
X Java String Regex - Sonderzeichen Filtern Allgemeine Java-Themen 5
J HTML-Sonderzeichen ersetzen Allgemeine Java-Themen 2
K _alle_ Sonderzeichen parsen Allgemeine Java-Themen 2
Q Sonderzeichen Ausgeben Allgemeine Java-Themen 8
L Das Sonderzeichen & Allgemeine Java-Themen 14
W Problem bei der Suche (binarySearch) vom deutschen Sonderzeichen "ß" im einem Array Allgemeine Java-Themen 6
data89 (Deutsche) Sonderzeichen in Java Allgemeine Java-Themen 3
W Nicht deustche sonderzeichen mit normalen Zeichenvergleichen Allgemeine Java-Themen 2
G Sonderzeichen für Files Allgemeine Java-Themen 5
M Sonderzeichen in String suchen Allgemeine Java-Themen 4
@ RegEx: Alle Sonderzeichen ausser dem Punkt Allgemeine Java-Themen 4
M Sonderzeichen bzw. deren Erkennung Allgemeine Java-Themen 3
W Sonderzeichen einlesen Allgemeine Java-Themen 3
M [Windows] Aufruf von Java mit Sonderzeichen im Classpath Allgemeine Java-Themen 5
karambara Sonderzeichen-Problem beim Lesen und Speichern von Dateien Allgemeine Java-Themen 6
byte Unicode Sonderzeichen Allgemeine Java-Themen 2
W Sonderzeichen in Access 97 schreiben Allgemeine Java-Themen 2
M Sonderzeichen; Javac auf Lin <-> Win Allgemeine Java-Themen 11
T Html aus einem String strippen + Sonderzeichen ersetzten Allgemeine Java-Themen 2
J sonderzeichen entfernen Allgemeine Java-Themen 6
N HTML Sonderzeichen Allgemeine Java-Themen 4
J URL Objekt zu File Objekt - wie lösche ich Sonderzeichen Allgemeine Java-Themen 3
H Maskieren von Sonderzeichen beim Dateien lesen Allgemeine Java-Themen 2
V Umlaute, sonderzeichen beim HTMLEditiorKit Allgemeine Java-Themen 2
M Sonderzeichen in einem Regex? Allgemeine Java-Themen 2
Master3000 Java Datei mehrmals einlesen Allgemeine Java-Themen 4
M Excel Datei Erstellen Allgemeine Java-Themen 2
E Input/Output Eigene Datei mit java öffnen Allgemeine Java-Themen 9
Tobero Download .jar von github lädt kaputte Datei runter Allgemeine Java-Themen 3
P Bat Datei in Java ausführen Allgemeine Java-Themen 2
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Jar-Datei ausführen Allgemeine Java-Themen 7
C Outlook msg-Datei Anhänge extrahieren Allgemeine Java-Themen 2
G Datei aus Ordner wählen, ohne den Dateinamen im Pfad angeben zu müssen Allgemeine Java-Themen 4
G Datei senden via Xmodem an Serial-Port Allgemeine Java-Themen 35
C Wav-Datei aus Jar laden? Allgemeine Java-Themen 11
L Best Practice Zip Datei aktualisieren Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
Gaudimagspam CSV-Datei auslesen in Java Allgemeine Java-Themen 7
S createTempFile erstellt keine temporäre Datei Allgemeine Java-Themen 13
Hatsi09 Jar datei ausführen verursacht NumberFormatException Allgemeine Java-Themen 9
kodela bestimmten Dateityp immer mit jar-Datei öffnen Allgemeine Java-Themen 17
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
H ArrayListe in CSV Datei speichern Allgemeine Java-Themen 6
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
N Txt Datei auslesen. Allgemeine Java-Themen 5
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
M Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
M Erstellungsdatum einer Datei Allgemeine Java-Themen 10
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
P Input/Output entfernte Datei mit Java öffnen ohne Download Allgemeine Java-Themen 5
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
J Fehlermeldung bei Ausführung von .jar-Datei Allgemeine Java-Themen 9
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
F Datei in String-Array einlesen Allgemeine Java-Themen 8
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
D ODS.Datei öffnet leider in Excel Allgemeine Java-Themen 3
L JavaFX JavaFX Chart in Apache Poi Excel Datei Allgemeine Java-Themen 2
D .txt Datei in .jar Datei speichern Allgemeine Java-Themen 3
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
L SQL Datei in Eclipse erstellen Allgemeine Java-Themen 3
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
Trèfle Excel-Datei nicht speicherbar, da von Java zum Bearbeiten gesperrt. Allgemeine Java-Themen 3
N Datei Zeilenweise Einlesen, Versteckte Zeichen Allgemeine Java-Themen 5
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
K Workupload datei mit Java Downloaden Allgemeine Java-Themen 6
H .jar Datei startet nicht richtig bei Doppelklick Allgemeine Java-Themen 11
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
M Java Eclipse- Datei exportieren Allgemeine Java-Themen 5
R jar-Datei funktioniert nicht Allgemeine Java-Themen 2
R .txt Datei einlesen und auf der Konsole ausgeben lassen Allgemeine Java-Themen 11
T Jar Datei nicht ausführbar Allgemeine Java-Themen 6
H jar-Datei mit java.exe anstatt mit javaw.exe ausführen Allgemeine Java-Themen 9
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
A Steuerung von Spiel aus Datei lesen Allgemeine Java-Themen 0
Javafan01 .sh datei in Java ausführen Allgemeine Java-Themen 1
M Speichern von Programmeinstellungen in Datei Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben