Bestes Text file encoding..?

Status
Nicht offen für weitere Antworten.

sirbender

Top Contributor
Hi,

ich entwickle unter Windows und Linux und stelle den Code in ein CVS. Manchmal verhaut es einige Zeichen weil scheinbar Eclipse unter verschiedenen OS ein anderes Text encoding nutzt.

Welches Text encoding sollte ich den einstellen in Eclipse fuer beide OS? Muss ich irgendwas mit dem CVS beachten?
 

sirbender

Top Contributor
Den Workspace in den Preferences auf UTF-8 stellen

Ich glaube UTF-8 deckt nicht alle Zeichen ab die ich darstellen will. Bsp.:

*.·*·.

Deswegen frage ich ja. Unter Linux nutze ich naemlich UTF-8 und da habe ich dann immer einige Zeichen die als Boxen angezeigt werden (verwendeter Font kennt das Zeichen nicht?)
 

Wildcard

Top Contributor
UTF-8 deckt so ziemlich alles ab. Dein Problem ist, dass du die Zeichen im falschen Encoding (cp1252 deutsches Windows Encoding) committed hast. Korrigiere alles in UTF-8, check es ein, danach passt es dann.
 

sirbender

Top Contributor
UTF-8 deckt so ziemlich alles ab. Dein Problem ist, dass du die Zeichen im falschen Encoding (cp1252 deutsches Windows Encoding) committed hast. Korrigiere alles in UTF-8, check es ein, danach passt es dann.

Aber wenn ich in Windows umstelle werden wie gesagt die Zeichen zerhackt. Und Linux hat UTF-8 und zeigt beim auschecken die Zeichen als Boxen an. Wie verhindere ich beim Umstellen auf UTF-8 dass die Zeichen 'verlorengehen'?
 

Wildcard

Top Contributor
Geht nicht. Konvertieren müsstest du vorher. Linux bietet dazu tools an. Wenn es nicht allzu viele Zeichen sind, würde ich sie aber lieber händisch korrigieren.
 

Der Müde Joe

Top Contributor
Ich entweickle in Ubuntu, 2 meiner Mitarbeiter in Xp und Vista. Alle haben UTF-8 eingestellt. Null problemo..(frei nach Alf)

EDIT:
Früher war alle Win und in CP-1256 (?), wurde mal alles auf UTF-8 konvertiert und aufs CVS gehauen.
 

Wildcard

Top Contributor
Sehe ich genauso. UTF-8 sollte in jedem Fall default sein, leider sieht das Platform Team das anderes und verwendet das Default Encoding des OS.
 

Guybrush Threepwood

Top Contributor
Aufpassen sollte man nur beim Starten des Programms aus Eclipse heraus. Da verwendet nämlich Ganymed die Workspace-Einstellung und nicht die Betriebssystem-Einstellung. Das sollte man dann unter Run configurations ändern. Ansonsten kann es beim Einlesen von z. B Textdateien unter Windows mit dem FileReader zu Porblemen kommen. Ein weiteres Problem: Wenn man mit NSIS über das NSIS-Eclipse-Plugin entwickelt, dann sollten die NSIS-Source-Codes selektiv auf CP1252 umgestellt werden, da sonst die Texte in den Installer komische Zeichen enthalten.

Ansonsten habe aber auch ich und alle Mitarbeiter auf UTF-8 umgestellt und es funktioniert top.
 

Wildcard

Top Contributor
da habt ihr ja n paar leutchen angeheuert :p
Wer ist wir?
Aufpassen sollte man nur beim Starten des Programms aus Eclipse heraus. Da verwendet nämlich Ganymed die Workspace-Einstellung und nicht die Betriebssystem-Einstellung
Du meinst: Eclipse verwendet beim einlesen das Betriebssystem Setting und eben nicht das Workspace Setting?
Das macht ja auch Sinn, beim einlesen soll sich der Quellcode ums Encoding kümmern und nicht die IDE. Das soll später ja auch laufen...
 

Ark

Top Contributor
Da hat wohl jemand gedacht, du wärst einer der Übeltäter. :D Aber ich muss zugeben, dass ich deinen Beitrag auch erst so gelesen, als wärst du "einer von ihnen", und mich deshalb voll gewundert hatte, bis ich merkte, dass dein Beitrag diesen Schluss nicht zulässt.

Fast zum Thema: Ich denke, es sollte nur noch zwei sinnvoll einzusetzende Zeichensätze geben: UTF-8 (vorrangig europäischer Raum) und UTF-16 BE (asiatischer Raum).

Ark
 

Ark

Top Contributor
Lässt sich doch auch alles in UTF-8 abbilden. Variable Länge, bis zu 4 Bit (also UTF-32)
Du meinst bestimmt 4 Bytes, oder? Natürlich könnte auch alles mit UTF-8 gemacht werden, aber dann bräuchte man für (übliche) CJK-Texte immerhin mindestens 3 statt 2 Bytes pro Zeichen. (Ja, okay, das ist jetzt nicht der Hammer ...)

Ark
 

Wildcard

Top Contributor
Du meinst bestimmt 4 Bytes, oder? Natürlich könnte auch alles mit UTF-8 gemacht werden, aber dann bräuchte man für (übliche) CJK-Texte immerhin mindestens 3 statt 2 Bytes pro Zeichen. (Ja, okay, das ist jetzt nicht der Hammer ...)
4 byte, natürlich... typo
Klar, UTF-8 braucht manchmal ein byte mehr als ein spezialisierter Charset, aber muss man heute wirklich immer noch um jedes byte kämpfen?
 

Wildcard

Top Contributor
Nein, nur auf das Java File und der Java Compiler muss wissen in welchem Encoding die Java Datei ist (passiert bei Eclipse automatischt).
 

Guybrush Threepwood

Top Contributor
Wer ist wir?

Du meinst: Eclipse verwendet beim einlesen das Betriebssystem Setting und eben nicht das Workspace Setting?
Das macht ja auch Sinn, beim einlesen soll sich der Quellcode ums Encoding kümmern und nicht die IDE. Das soll später ja auch laufen...

Naja, das widerspricht aber der Java API vom FileReader:
Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate.

Das verstehe ich so, dass das Programm das Encoding des Betriebssystems verwenden soll, und nicht die Workspace-Einstellung. Auf Windows bedeutet das eben, dass beim Einlesen von Text-Dateien automatisch CP1252 angenommen wird. Ist auch praktisch in jedem Javabuch so beschrieben. Ich finde, Eclipse hält sich da seit Ganymed (davor war es anders) nicht an den vorgesehenen Standard. Es hat mich viel Zeit gekostet, nach der Umstellung auf Ganymed herauszufinden, woher diverse Probleme kommen, wo doch die Programme mit Europa problemlos funktionierten.
 

sliwalker

Top Contributor
Hmm,

ich weiß nicht ob ihr gerade von zwei verschiedenen Dingen sprecht.
Wildcard bezieht sich glaube ich auf das Encoding der Java-Quelldatei und Du sprichst vom FileReader.
Stimmt das so?

Der FileReader nimmt das default OS-Encoding, ganz gleich was in der IDE eingestellt ist, weil die IDE das Encoding nur für die Source-Files an sich verwendet. Aber natürlich kannst Du dem reader auch sagen, dass er ein anderes Encoding nehmen soll.

greetz
SLi
 

Wildcard

Top Contributor
Naja, das widerspricht aber der Java API vom FileReader:

Das verstehe ich so, dass das Programm das Encoding des Betriebssystems verwenden soll, und nicht die Workspace-Einstellung. Auf Windows bedeutet das eben, dass beim Einlesen von Text-Dateien automatisch CP1252 angenommen wird. Ist auch praktisch in jedem Javabuch so beschrieben. Ich finde, Eclipse hält sich da seit Ganymed (davor war es anders) nicht an den vorgesehenen Standard. Es hat mich viel Zeit gekostet, nach der Umstellung auf Ganymed herauszufinden, woher diverse Probleme kommen, wo doch die Programme mit Europa problemlos funktionierten.

Ich habe es gerade mal selbst getestet, weil mir die Aussage spanisch vorkommt, und du liegst daneben. Nichts dergleichen passiert.
 

Guybrush Threepwood

Top Contributor
Ich habe es gerade mal selbst getestet, weil mir die Aussage spanisch vorkommt, und du liegst daneben. Nichts dergleichen passiert.

Ok, noch einmal konkret (und ich bin mir sicher, dass es stimmt): Wenn in der Workspace ein Projekt auf UTF-8 steht, dann werden seit Ganymed automatisch bei per FileReader unter Windows eingelesenen Textdateien auch UTF-8-Kodierung zugrunde gelegt. Erst wenn man unter Run Configurations -> Common -> Console Encoding auf Cp1252 gestellt wird, dann wird das Standard Windows Encoding verwendet.

Beispiel: Projekt auf UTF-8, Console Encoding "Default - inherited (UTF-8)"
Das ist ein Text mit den Umlauten � � � � � � �.

Gleiches Programm, nun mit Console Ecoding auf Cp1252 :
Das ist ein Text mit den Umlauten ä ü ö Ä Ü Ö ß.


Und hier das Progrämmchen:
Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class ReaderTest {

	public static void main(String[] args) {
		new ReaderTest();

	}

	public ReaderTest() {
		String content = null;

		FileReader reader = null;

		try {
			File file = new File("c:/temp/test.txt");
			reader = new FileReader(file);

			long fileLength = file.length();

			char[] arr = new char[(new Long(fileLength)).intValue()];
			int readedElements = reader.read(arr);
			if (-1 != readedElements) {
				content = new String(arr);
			}

		} catch (FileNotFoundException fnfex) {
			System.out.println(fnfex.getMessage());
		} catch (IOException ioex) {
			System.out.println(ioex.getMessage());
		} finally {
			if (null != reader) {
				try {
					reader.close();
				} catch (IOException ioex) {
					System.out.println(ioex.getMessage());
				}
			}
		}

		System.out.println(content);
	}
}

P.S.: Das ist nicht nur bei der Ausgabe in der Console so, sondern auch bei aus Textdateien eingelesenen Labels in GUIs und der Debugger zeigt es auch. Bei Europa war das nicht so.
 
Zuletzt bearbeitet:

sliwalker

Top Contributor
Hoi,

ich muss Dir widersprechen.
Nimm mal diesen Code:

Code:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class ReaderTest {
 
    public static void main(String[] args) {
        new ReaderTest();
 
    }
 
    public ReaderTest() {
        String content = null;
 
        FileReader reader = null;
 
        try {
            File file = new File("c:/test/test.txt");
            reader = new FileReader(file);
            
            System.out.println(reader.getEncoding());
            
            long fileLength = file.length();
 
            char[] arr = new char[(new Long(fileLength)).intValue()];
            int readedElements = reader.read(arr);
            if (-1 != readedElements) {
                content = new String(arr);
            }
 
        } catch (FileNotFoundException fnfex) {
            System.out.println(fnfex.getMessage());
        } catch (IOException ioex) {
            System.out.println(ioex.getMessage());
        } finally {
            if (null != reader) {
                try {
                    reader.close();
                } catch (IOException ioex) {
                    System.out.println(ioex.getMessage());
                }
            }
        }
 
        System.out.println(content);
    }
}

Du erhälst beides mal Cp1252.
Der reader verändert sich nicht, jedoch die Konsole. Und wenn Du ein Cp1252 Encoding einliest und es als UTF-8 interpretierst, kommt Murke raus.
Meinen Link von oben gelesen?

greetz
SLi
 

Guybrush Threepwood

Top Contributor
???:L

Ich habe Deinen Code genommen und die Codezeile "System.out.println(reader.getEncoding());" eingefügt. Wenn ich unter Run Configurations das Default Ecoding (UTF-8) eingestellt habe:
UTF8
Das ist ein Text mit den Umlauten � � � � � � �.

Wenn ich Run Configuration auf Cp1252 stelle, oder das Encoding der Quelltextdatei auf CP1252 stelle und bei Run Configuration auf Default klicke:
Cp1252
Das ist ein Text mit den Umlauten ä ü ö Ä Ü Ö ß.

Habe ich jetzt einen Knoten im Hirn oder stimmt was mit meinem Rechner nicht? Der Reader verändert aufgrund der Run Configuration sein Encoding.
???:L
 

sliwalker

Top Contributor
Also bei mir nicht.
Wenn ich das Beispiel mit zwei verschiedenen Console Encodings starte, kommt bei mir immer die gleiche Ausgabe.
Der Reader hat immer das Encoding des OS(bei mir). Keine Ahnung warum das bei Dir anders ist.
Aber lange Rede kurzer Sinn, mit folgendem Code kannst Du schließlich überprüfen, was in den Properties steht.

Code:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 
public class ReaderTest {
 
    public static void main(String[] args) {
        new ReaderTest();
 
    }
 
    public ReaderTest() {
        String content = null;
 
        FileReader reader = null;
 
        try {
            File file = new File("c:/test/test.txt");
            reader = new FileReader(file);
            
            System.out.println("ReaderEcoding: " + reader.getEncoding());
            System.out.println("Property: " + System.getProperty("file.encoding"));
            
            long fileLength = file.length();
 
            char[] arr = new char[(new Long(fileLength)).intValue()];
            int readedElements = reader.read(arr);
            if (-1 != readedElements) {
                content = new String(arr);
            }
 
        } catch (FileNotFoundException fnfex) {
            System.out.println(fnfex.getMessage());
        } catch (IOException ioex) {
            System.out.println(ioex.getMessage());
        } finally {
            if (null != reader) {
                try {
                    reader.close();
                } catch (IOException ioex) {
                    System.out.println(ioex.getMessage());
                }
            }
        }
 
        System.out.println(content);
    }
}
 
S

Spacerat

Gast
Habe ich jetzt einen Knoten im Hirn oder stimmt was mit meinem Rechner nicht? Der Reader verändert aufgrund der Run Configuration sein Encoding.
Ähh... "Knoten im Hirn", um es mal mit deinen Worten zu sagen (Wohl zu viel "Grog" gehabt, wenn du verstehst was isch meine :)). Eclipse verwendet die Einstellungen nur zum Lesen der Quelltexte und für die Ausgabe in die Konsole. Für das Lesen innerhalb von FileReader ist die System-Property "file.encoding" zuständig. Und die ändert sich durch die Einstellungen in Eclipse nicht.
@Edit: :oops: Vieeel zu lagsaaam...
 
Zuletzt bearbeitet von einem Moderator:

Guybrush Threepwood

Top Contributor
Ähh... "Knoten im Hirn", um es mal mit deinen Worten zu sagen (Wohl zu viel "Grog" gehabt, wenn du verstehst was isch meine :)). Eclipse verwendet die Einstellungen nur zum Lesen der Quelltexte und für die Ausgabe in die Konsole. Für das Lesen innerhalb von FileReader ist die System-Property "file.encoding" zuständig. Und die ändert sich durch die Einstellungen in Eclipse nicht.

Da soll mich doch ein Piranhapudel ...

Bei mir unter Eclipse Ganymed ändert sich
Java:
System.out.println(System.getProperty("file.encoding").toString());
immer gemäß der Kodierung der Workspace. Bei Eclipse Europa war das nicht so. Das Verhalten ist neu ab Version 3.4.0. Die Einstellung betrifft also *nicht* nur das Encoding der Quelltext-Dateien und die Ausgabe auf der Console, sondern das "file.encoding" und möglicherweise auch andere Properties ändern sich dadurch. Korrigieren lässt es sich - wie gesagt - wenn man unter Run Configurations -> Common -> Console Encoding das Enncoding umstellt.

Das tritt bei mir auf Windows unter XP und Vista auf. Auf anderen Systemen habe ich es nicht probiert.

Fazit: Beim Einlesen von Dateien immer Encoding fest angeben, anstatt sich auf Voreinstellungen zu verlassen.
 

sliwalker

Top Contributor
Aha,

gut zu wissen.
Kann ich nicht nachprüfen, nehme es aber mal so hin.
Habe Ganymede 3.3.x auf WinXPSP3.

Das ist ja ein starkes Stück...
Sowas darf aber nicht sein!

greetz
SLi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
reibi log4j - Bestes Konzept Allgemeine Java-Themen 10
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
K Bildschirm auslesen/ Text erkennen Allgemeine Java-Themen 5
berserkerdq2 Text über einen Shape anzeigen (Scenebuilder) Allgemeine Java-Themen 1
M Thymeleaf th value und th text Allgemeine Java-Themen 1
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
_user_q Eingegebenen Text wiederholt schreiben lassen Allgemeine Java-Themen 9
G Darstellung von Text auf MapContext von GeoTools Allgemeine Java-Themen 2
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
Mozart53 JLabel nur meinen Text verschieben ohne Image Allgemeine Java-Themen 3
izoards Bestimmter Text aus PDF extrahieren Allgemeine Java-Themen 3
B Scanner erkennt keinen Text in Textdatei, obwohl welcher drinsteht Allgemeine Java-Themen 10
K HTMLEditor HTML Text in Rich Text umwandeln Allgemeine Java-Themen 14
kodela JDialog zeigt Text nicht an Allgemeine Java-Themen 5
L Text filtern Allgemeine Java-Themen 1
Bluedaishi TEXT Kodierung Allgemeine Java-Themen 3
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
S Ini Text aus String parsen Allgemeine Java-Themen 1
M itext - Button der Text in Zwischenablage stellt Allgemeine Java-Themen 0
E CSV mit Text und Binärdaten auslesen Allgemeine Java-Themen 7
FRI3ND Datentypen Date-Array sortieren - Text mitnehmen? Allgemeine Java-Themen 7
I Text suchen und ersetzen im Word Dokument Allgemeine Java-Themen 3
windl Text mining / deep learning Allgemeine Java-Themen 0
I Text aus Input-Box entnehmen und zuweisen Allgemeine Java-Themen 1
KeexZDeveoper Text Mining Allgemeine Java-Themen 3
L Input/Output Wie kann man in der Konsole einen Text farbig ausgeben z.b in grün Allgemeine Java-Themen 6
B Arrays mit Text und Zahlen füllen Allgemeine Java-Themen 3
A Datenexport (Text und Draw) Allgemeine Java-Themen 1
L Text von txt auf JTextArea Allgemeine Java-Themen 4
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
A 2D-Grafik Text in ein Bild schreiben Allgemeine Java-Themen 11
T Textarea text wird immer überschrieben Allgemeine Java-Themen 4
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
T itext: text in ein textfeld hinzufügen Allgemeine Java-Themen 2
B Farbiger Text in der Konsole Allgemeine Java-Themen 1
K Pdf mit dynamischem Text mit iText Allgemeine Java-Themen 0
D Text Analyzer Allgemeine Java-Themen 2
RalleYTN Audiodatein(.ogg/.wav) in Text konvertieren Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
X Löschen von einer Zeile in einer Text Datei. Klappt nicht. Allgemeine Java-Themen 4
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
J Java - Zeile aus Text datei löschen Allgemeine Java-Themen 13
M Text in erstelltes Excelfile schreiben Allgemeine Java-Themen 6
N Input/Output Website Text auslesen und bestimmte Zeilen wiedergeben Allgemeine Java-Themen 4
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
P HTML Text bearbeiten Allgemeine Java-Themen 1
B JFrame Text Ausgabe Allgemeine Java-Themen 7
G Makierter Text in Arbeitsspeicher Allgemeine Java-Themen 2
B Text in die Mitte der Konsole schreiben. Allgemeine Java-Themen 1
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
P iText Text zentrieren Allgemeine Java-Themen 3
J Verschlüsselung von Text? Allgemeine Java-Themen 2
M Text datei in java jar datei einbinden Allgemeine Java-Themen 4
S Swing Text in eine JTextArea schreiben Allgemeine Java-Themen 17
M Verschlüsselung von Text und Files durch RSA (Encoding Problem) Allgemeine Java-Themen 7
S Robuste Methode um Text von HTML code zu extrahieren..? Allgemeine Java-Themen 6
achillesat Rich Text Editor Allgemeine Java-Themen 2
M CMD-Text anzeigen Allgemeine Java-Themen 10
G Text Mining Allgemeine Java-Themen 7
B Text auf Standarddrucker drucken Allgemeine Java-Themen 3
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
nrg Find and replace Text docx Allgemeine Java-Themen 6
M Ein bestimmtes Wort in einem Text zählen (String in String) Allgemeine Java-Themen 9
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
M Funktion gesucht: Text vektorisieren Allgemeine Java-Themen 20
D Wort in Text mit >100.000 Wörter finden Allgemeine Java-Themen 7
B Text wird nicht richtig angezeigt Allgemeine Java-Themen 9
Q Text Datei einlesen Allgemeine Java-Themen 27
N .doc text ändern Allgemeine Java-Themen 12
R Komponente hat nicht die gesetzten Eingeschaften (Text, Farbe) Allgemeine Java-Themen 3
M NOA an den Source Text des Dokumentes kommen Allgemeine Java-Themen 7
A Text via RegEx durchsuchen und teile ersetzten Allgemeine Java-Themen 5
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
Y Eclipse ppt Folie erzeugen + text plazieren Allgemeine Java-Themen 4
cedi Eingegebenen Text in der Konsole nicht sichtbar machen oder nur in Sternchen anzeigen Allgemeine Java-Themen 2
D markierten Text kopieren Allgemeine Java-Themen 2
P Doppeltverkettete Listen + Text Allgemeine Java-Themen 5
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
C Datei als ASCII text einlesen ? Allgemeine Java-Themen 16
R Texterkennung - Text aus einem/r Bild/Grafik auslesen Allgemeine Java-Themen 2
M String in Html Text umwandeln Allgemeine Java-Themen 2
T eingefügter Text nach dem rendern spiegelverkehrt Allgemeine Java-Themen 2
lumo encoding einer text-datei Allgemeine Java-Themen 2
E Text ans Ende einer Textdatei anfügen Allgemeine Java-Themen 2
E JTextArea / JEditorPane + Text formatieren Allgemeine Java-Themen 3
R Java Text anderer Schriftart einlesen Allgemeine Java-Themen 2
A AES Key aus Text erzeugen Allgemeine Java-Themen 2
S Koordinaten aus einem Text filtern Allgemeine Java-Themen 11
turmaline Text aus Web-Seiten auslesen Allgemeine Java-Themen 1
MQue Graphics2D Text Allgemeine Java-Themen 2
U Text verschmelzen Allgemeine Java-Themen 8
martin82 Java-Code aus Text-Datei parsen Allgemeine Java-Themen 3
W Text curser auswählen für Paste Allgemeine Java-Themen 15
G HTML-Datei einlesen, Plain Text in Textfile speichern Allgemeine Java-Themen 4
B UTF-8 Text Allgemeine Java-Themen 3
H Passwortgschützter Text Allgemeine Java-Themen 13
C IReport Feldberechnen und als Text ausgeben Allgemeine Java-Themen 4
D Bild in text tabelle umwandeln Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben