Java UTF-8 encoding

Hallo zusammen
ich habe folgendes Problem …
ich habe verschieden codierte Text dateien ASCII Cp1252 usw. in meiner Netbeans umgebung funktioniert das auch soweit nur wenn ich das ganze
als fertiges Jar File laufen lassen geht das nicht .

was mache ich falsch oder wie muss ich das übergeben damit es funktioniert

vielen Dank für euere Hilfe

worum gehts denn genauer?
liest du die Dateien mit Java-Mitteln (welche?) ein und bekommst unterschiedliche Ergebnisse,
oder produzierst du Dateien für andere Programme wo es Probleme gibt, oder oder?

hier noch ein interessantes Testprogramm zum Encoding/ Charset,
liefert das bei dir in der IDE laufend und evtl. im Jar laufend unterschiedliches?

How to Find the Default Charset/Encoding in Java? - Stack Overflow

Ich muss aus den text dateien checksummen berechnen in der Netbeans umgebung funktioniert das einwandfrei nur als fertiges jar file ist die checksumme immer falsch.
einlesen einer datei so:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), “UTF-8”));
weg schreiben so :
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file.getAbsoluteFile()), “UTF-8”));

wie gesagt in der IDE umgebung kein problem nur als selbstandiges Jar file gibt es probleme da dort Steuerzeichen enthalten sind

*** Edit ***

Hab mir gerade deinen Link angesehen .
wo setze ich den System.setProperty(“file.encoding”, “Latin-1”);
in jeder klasse wo ich das brauche denn ich brauche ja nicht nur UTF-8

ich weiß nicht ob ich letztlich helfen kann, oder eher nerve, aber:

(edit: lange Mail, oberes vielleicht obsolet wenn mit unteren Teil zu Encoding, Default-Einstellungen klareren Durchblick)

kannst du weiter genauer werden, welche Zeichen machen welche Probleme, wie im String erkennbar?
was erwartest du als String, was kommt stattdessen, kannst du das auf einzelne char hin genau untersuchen?

stelle idealerweise eine minmala ‚ASCII Cp1252‘-Problemdatei zusammen, z.B. mit „abcProblemzeichen“ in nur einer Zeile, oder ein paar mehr Zeilen, je nachdem was nötig ist wie Zeilenumbruch,
oder kannst du die Datei nicht zusammenkürzen, verschwindet dann der Fehler auf unbekannte Weise oder findest du ihn schlicht nicht (bisher)?


sehe ich das richtig, dass du mit
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
die Datei standardmäßig mit falschen Encoding einliest?

vielleicht ist das Problem hier, dass es in NetBeans überhaupt funktioniert, und eine Lösung dann dass es in NetBeans auch nicht mehr geht, bestimmt nicht gewünscht :wink:
du wünschst die ‚ASCII Cp1252‘-Datei dauerhaft mit UTF-8 einzulesen?
hast du begründete Annahmen dass das so geht oder allein auf Verdacht und bisher froh dass vor Jar noch keine Probleme gesehen?

wie sieht es mit Änderung des CharSets auf (nicht ausprobiert, von irgendwo kopiert)
Reader reader = new InputStreamReader(new FileInputStream(file), "windows-1252");
aus, und sei es nur testweise versucht,
wird dann, wie auch immer sich das Problem aktuell darstellt, besser eingelesen? sowohl in IDE als auch Jar?


hat der BufferedWriter aktuell eine wichtige Bedeutung für das Problem,
oder reicht es zunächst, sich auf eindeutig vor Programmstart fertig erstellte Dateien + BufferedReader zu konzentrieren?


[quote=bluedaishi]Hab mir gerade deinen Link angesehen .
wo setze ich den System.setProperty(„file.encoding“, „Latin-1“);
in jeder klasse wo ich das brauche denn ich brauche ja nicht nur UTF-8[/quote]

ein System-Property ist einer statischen Variable ähnlich, einmal bei Programmstart dürfte reichen,
aber welche Auswirkungen das generell hat, gegenüber Charset und dann noch deiner Angabe von UTF-8 direkt bei InputStreamReader,
das sind viele Fragen auf einmal,

erst innerhalb des Programms gesetzt anscheinend keine Auswirkung auf Charset.defaultCharset() mehr,
was man anscheinend auch sonst nicht austauschen kann

nach
utf 8 - Setting the default Java character encoding? - Stack Overflow
hilft für Charset.defaultCharset() und dann wohl auch InputStreamReader ohne nähere Angabe
das Setzen des Encodings bei Programmstart mit -D-Parameter

für Jar vielleicht auch interessant in Manifest oder was es da alles verrücktes gibt,

hast du jedenfalls getestet und unterschiedliche Angaben für IDE-Start vs. Jar?
kommt mir durchaus bekannt vor dass IDE UTF-8 setzt, so auch in meinem Eclipse,
ohne diese Einstellung in General - Workspace gibt das Testprogamm verstärkt Cp1252 aus auf Windows

sollte aber wiederum doch eher keinen Einfluss haben wenn Encoding bei InputStreamReader manuell gesetzt?..

wie kommst du darauf das du nervst … ich bin doch zufrienden das mir jemand hilft :slight_smile:
ich zum beispiel eine zeile die so anfängt
DC1ÿDC1

wenn ich das ganze ohne UTF-8 anweisung mache dann wir das danach so dargestellt
DC1?DC1

oder zum beispiel wenn sich in der Datei ein € befindet kommt dabei ein ? herraus

den BufferedWriter benutze ich um die dateien neu zuschreiben

*** Edit ***

Wie kann ich den java anweisen zu einem bestimmten zeitpunkt utf-8 zubenutzen und wenn ich ASCII brauche dann das zu benutzen

bei InputStreamReader eigentlich so wie du es schon machst, sollte theoretisch überall gleich funktionieren…

vielleicht geht es ja auch bereits, nur die Ausgabe auf Konsole Problem wie weiter unten schon vermutet
(den Block hier oben später editiert, alles so schnell durcheinander…)


aus deinem Beispiel ist nicht viel zu erkennen:

„DC1ÿDC1“ steht nehme ich an in der Datei? aber wie kodiert, besser eindeutige Testdatei erstellen und hier im Forum hochladen,
oder genaue Bytefolge nennen


„wenn ich das ganze ohne UTF-8 anweisung mache“
ist auf verschiedene unklare Weisen zu interpretieren oder auch nicht zu verstehen,
was hat das mit IDE vs. Jar zu tun? verwendest du auch mal anderen Code als wie genannt immer
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));?

neueste Tests/ Erkenntnisse zu Default-Encoding/ Charset schon einfließen lassen?


„DC1?DC1“ ist dann als der eingelesene String anzunehmen?
ein Fragezeichen ist immer trügerisches Ergebnis, verschiedenste unbekannte Zeichen können so dargestellt werden,
selbst ein in Java korrekter String könnte auf schlechter Konsole (Jar-Ausführung hat sicher andere Anzeige als IDE-interne Konsole) so angezeigt werden

Java-Strings lieber eindeutig als Liste von chars untersuchen, jeder char kann auf int gecastet werden, idealerweise int-Wert nennen für Eindeutigkeit,
gerne die vermeintliche Interpretation daneben

praktisch ist auch, einen Test-String wie „DC1ÿDC1“ im Programm fertig zu definieren,
falls beim Kompilieren kein Verlust-Streich gespielt wird und equals mit eingelesenen String true ergibt, dann ist die Eingabe vielleicht gar nicht so falsch

        for (int i = 0; i < st.length(); i++)
        {
            char c = st.charAt(i);
            System.out.println("i: " + i + ", " + c + " -> " + ((int)c));

        }
i: 0, D -> 68
i: 1, C -> 67
i: 2, 1 -> 49
i: 3, ÿ -> 255
i: 4, D -> 68
i: 5, C -> 67
i: 6, 1 -> 49

String.getBytes() ist auch noch interessant, wobei wieder Encoding-abhängig…