Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

1

Thursday, July 17th 2008, 3:04pm

Zeichensatz-Probleme in Java

Hi,

ich habe folgendes Problem und kriege es nicht in den Griff. Ich schreibe an einem Kryptografie-Programm in Java (Version 1.6.0_05) / Eclipse (Version 3.2.1). Entwickelt wird unter Windows XP SP 2.

In der GUI (Swing) habe ich ein Feld für Eingabe eines Klartextes und ein Feld für Ein-/Ausgabe des Chiffretext. Der Chiffretext enthält dann sehr viele Sonderzeichen (z.B. ein Auszug: v@KÕ±G qB`%RÕí]¯ÉÆ!).

Das Problem ist jetzt das folgende: Wenn ich den Chiffretext aus der entsprechenden JTextArea abspeichere in eine Text-Datei und dann wieder aus dieser Text-Datei in eine JTextArea einlade, haben sich ein paar Zeichen geändert!

Ich habe schon einige Sachen ausprobiert. Im Moment läuft das Speichern und Laden über die folgenden (bzw. analoge) Code:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
JFileChooser chooser = new JFileChooser();
chooser.showSaveDialog(null);

try {
	BufferedWriter out = new BufferedWriter(
		new OutputStreamWriter(
		new FileOutputStream(chooser.getSelectedFile()), "Cp850"));
					
	String s = plaintextArea.getText();
	for(int i=0 ; i<s.length() ; i++) {
		out.write(s.charAt(i));
	}
	out.close();
} catch (IOException ioe) { }
catch(NullPointerException npe) { }


Aber das führt auf den oben beschriebenen Fehler.

Kennt das jemand und hat eine Lösung parat?
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

RedKen

Trainee

  • "RedKen" is male

Posts: 105

Date of registration: Nov 15th 2004

Location: Hannover Rock-City

2

Thursday, July 17th 2008, 3:12pm

Da Java intern mit UTF-8 arbeitet könnte es vielleicht sein, dass der Chiffretext in UTF-8 ist und dann nicht korrekt in die mit cp850 codierte Datei geschrieben wird, insbesondere, wenn du char für char schreibst (du übergibst ne zahl und die wird als cp850 codierters Zeichen interpretiert, nehme ich an).
Ich würde also entweder

Java source code

1
out.write(s);
versuchen, und hoffen, dass der String korrekt codiert wird, oder die Encodierung im Konstruktoraufruf ändern.
ich sitz' am Puls der Zeit und schneid' und schneid' und schneid'...

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

3

Thursday, July 17th 2008, 3:28pm

Hilft leider auch nicht. Es besteht dasselbe Problem wie davor! Vielleicht liegt es ja auch gar nicht am Ein- und Auslesen, sondern an der Darstellungsfähigkeit der JTextArea!? Hat dazu vielleicht jemand eine Idee?
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

Warui

Turner, Serveradmin & Workaholic

  • "Warui" is male

Posts: 717

Date of registration: Apr 25th 2006

Location: Südstadt

Occupation: (iter (B.Sc. Inf, 8)) \n (be-a-slave ("SRA", "Bachelor Thesis")) \n (be-a-programmer-slave ("Freelancer", "Programming"))

4

Thursday, July 17th 2008, 5:33pm

hmm .... frag doch mal den Eclipse-Debugger :-)
Dann siehst du ziemlich schnell, an welcher Stelle es denn nun hakt, wenn du eh schon was vermutest (siehe RedKen's Beitrag), dann ist es umso einfacher, den Fehler zu finden :D
Erwachsenwerden? Ich mach ja viel Scheiß mit, aber nicht jeden!

julianr

Erfahrener Schreiberling

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

5

Thursday, July 17th 2008, 8:37pm

Da Java intern mit UTF-8 arbeitet


More like UTF-16.

Nach außen hin ist trotzdem prinzipiell immer alles kaputt. Java-Anwendungen sind auch immer die ersten, die auf nem Mac UTF-8 noch als MacRoman darzustellen versuchen :( Durfte ich auch gerade erst debuggen, auch in einer kryptografischen Anwendung (keysign.org ;) ), und mir fällt gerade eine Stelle ein, die ich bisher nur mit ASCII getestet habe. Uh-oh...

kiLLroy

Alter Hase

  • "kiLLroy" is male

Posts: 436

Date of registration: Apr 21st 2008

Location: Hannover

Occupation: CTO

6

Thursday, July 17th 2008, 9:36pm

Hilft leider auch nicht. Es besteht dasselbe Problem wie davor! Vielleicht liegt es ja auch gar nicht am Ein- und Auslesen, sondern an der Darstellungsfähigkeit der JTextArea!? Hat dazu vielleicht jemand eine Idee?


Heißt das jetzt wenn du den String, den du in das Eingabefeld eingegeben hast, einfach printest wird er bereits (bzw. einige Zeichen davon) falsch ausgegeben? Oder evtl. besser: Wenn du den eingegebenen String in eine Datei schreibst, sind die Zeichen in der Datei dann schon falsch, oder alles erst beim wieder-einlesen?
Man hört ja oft verdammt gute Aussagen, prädestiniert für eine Signatur, aber jedes mal vergesse ich mir solche aufzuschreiben, darum steht hier dieser Mist...

This post has been edited 1 times, last edit by "kiLLroy" (Jul 17th 2008, 9:37pm)


  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

7

Thursday, July 17th 2008, 10:04pm

RE: Zeichensatz-Probleme in Java

In der GUI (Swing) habe ich ein Feld für Eingabe eines Klartextes und ein Feld für Ein-/Ausgabe des Chiffretext. Der Chiffretext enthält dann sehr viele Sonderzeichen (z.B. ein Auszug: v@KÕ±G qB`%RÕí]¯ÉÆ!).
Ich würde eher an dieser Stelle ansetzen. Was versprichst Du Dir davon, den Chiffretext unbedingt auf diese Weise einzugeben/darzustellen? Die Kombination der so auftretenden nicht-darstellbaren Zeichen mit einer Texteditor-Komponente, die für sowas bestimmt nicht ausgelegt ist, schreit doch geradezu nach Problemen. Schau Dir für diesen Zweck lieber Kodierungen wie etwa Base64 an oder lies den Chiffretext direkt aus einer Datei.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

This post has been edited 2 times, last edit by "Joachim" (Jul 17th 2008, 10:04pm)


ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

8

Thursday, July 17th 2008, 10:26pm

Wie lädst du denn den den Inhalt der Textdatei in die Textarea? Doch hoffentlich mit Java oder? Windows verwendet IMHO nämlich nicht cp850 sondern ANSI wenn du die Datei einfach in Notepad öffnest und in die Area einfügst.

Edit: Ich seh grad, ANSI ist die falsche Bezeichnung. Es handelt sich um Windows-1252.
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

This post has been edited 2 times, last edit by "ctk" (Jul 17th 2008, 10:43pm)


schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

9

Friday, July 18th 2008, 5:08pm


Da Java intern mit UTF-8 arbeitet


More like UTF-16.

Nach außen hin ist trotzdem prinzipiell immer alles kaputt. Java-Anwendungen sind auch immer die ersten, die auf nem Mac UTF-8 noch als MacRoman darzustellen versuchen :( Durfte ich auch gerade erst debuggen, auch in einer kryptografischen Anwendung (keysign.org ;) ), und mir fällt gerade eine Stelle ein, die ich bisher nur mit ASCII getestet habe. Uh-oh...
Und? Wie hast du es dann hingekriegt? Hast du doch, oder?
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

10

Friday, July 18th 2008, 5:11pm

Wie lädst du denn den den Inhalt der Textdatei in die Textarea? Doch hoffentlich mit Java oder? Windows verwendet IMHO nämlich nicht cp850 sondern ANSI wenn du die Datei einfach in Notepad öffnest und in die Area einfügst.
Also ich der Code zum Laden eines Inhalts aus einer Textdatei in die JTextArea ist wie folgt:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Laden eines Klartexts aus einer Datei
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog(null);

// Löschen der Textarea
plaintextArea.setText("");

String s;
try {
	BufferedReader in = new BufferedReader(
		new InputStreamReader(
		new FileInputStream(chooser.getSelectedFile()), "UTF-8"));

	while( null != (s = in.readLine()) ) {
		plaintextArea.setText(plaintextArea.getText()+s); 
	}

	in.close();
				
} catch (IOException ioe) { }
catch(NullPointerException npe) { }


Also ich lade das nicht via Copy & Paste in die JTextArea, sondern mit Java!
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

11

Friday, July 18th 2008, 5:14pm

Heißt das jetzt wenn du den String, den du in das Eingabefeld eingegeben hast, einfach printest wird er bereits (bzw. einige Zeichen davon) falsch ausgegeben? Oder evtl. besser: Wenn du den eingegebenen String in eine Datei schreibst, sind die Zeichen in der Datei dann schon falsch, oder alles erst beim wieder-einlesen?
Das Problem tritt erst auf, wenn ich den Inhalt der Datei mit den vielen Sonderzeichen wieder in Java einlesen und in die JTextArea schreiben will. Ob die Zeichen in der Datei richtig angezeigt werden hängt davon ab, mit welchem Editor ich sie mir angucke. Notepad kann z.B. gar nichts (man sieht fast nur blanks). JEdit dagegen zeigt (glaube ich, wie soll man da sicher sein?) alle Sonderzeichen richtig an.
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

12

Friday, July 18th 2008, 5:16pm

RE: RE: Zeichensatz-Probleme in Java

Ich würde eher an dieser Stelle ansetzen. Was versprichst Du Dir davon, den Chiffretext unbedingt auf diese Weise einzugeben/darzustellen? Die Kombination der so auftretenden nicht-darstellbaren Zeichen mit einer Texteditor-Komponente, die für sowas bestimmt nicht ausgelegt ist, schreit doch geradezu nach Problemen. Schau Dir für diesen Zweck lieber Kodierungen wie etwa Base64 an oder lies den Chiffretext direkt aus einer Datei.
Über Base64 habe ich auch schon nachgedacht. Aber ich möchte gerne, dass man den Chiffretext auch ansehen kann. Das ist ja eine nicht allzu vermessene kryptografische Forderung, oder :P ? Außerdem muss ja irgendeine vernünftige Lösung für dieses Problem in Java geben!?
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

julianr

Erfahrener Schreiberling

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

13

Friday, July 18th 2008, 5:18pm

Noch gar nicht, und da wo ich es behoben habe, habe ich einfach in den (nicht kritischen) Eingabedaten die Umlaute umschrieben. Macht ja auch Spass.

In einem anderen (JRuby-)Projekt sind allerdings auch mal Zeichen verschwunden. Da habe ich dann den ganzen Buffer/Reader/Writer/wasweißich von vornherein weggelassen und immer explizit mit char[] und den entsprechenden Konvertierungsfunktionen von String gearbeitet, irgendwann ging es dann. Den Code gibts aber zum Glück nicht mehr.

This post has been edited 1 times, last edit by "julianr" (Jul 18th 2008, 5:20pm)


schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

14

Friday, July 18th 2008, 5:28pm

Das gibt es doch aber gar nicht, dass das in Java so ein Problem ist. Selbst wenn man googelt findet man selbst nach Stunden (!) nichts brauchbares!
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

15

Friday, July 18th 2008, 5:39pm

RE: RE: RE: Zeichensatz-Probleme in Java

Über Base64 habe ich auch schon nachgedacht. Aber ich möchte gerne, dass man den Chiffretext auch ansehen kann. Das ist ja eine nicht allzu vermessene kryptografische Forderung, oder :P ?
Vermessen nicht, aber IMHO völlig überflüssig. Welchen Nutzen versprichst Du Dir davon?
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

16

Friday, July 18th 2008, 5:45pm

Das gibt es doch aber gar nicht, dass das in Java so ein Problem ist.
Keine Ahnung, woran es nun liegt, aber ich schätze, daß JTextArea und Co. für solche Anwendungszwecke einfach nicht gemacht sind. Gerade Steuerzeichen und ähnliches sind hier sicherlich problematisch. Es ist nun einmal schwierig, in einem Texteditor "carriage return", "backspace", "soft hyphen" usw. brauchbar darzustellen.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

sasa

Junior Schreiberling

  • "sasa" is male

Posts: 133

Date of registration: Oct 24th 2005

Location: Celle

Occupation: Software Engineer

17

Saturday, July 19th 2008, 5:09pm

Heißt das jetzt wenn du den String, den du in das Eingabefeld eingegeben hast, einfach printest wird er bereits (bzw. einige Zeichen davon) falsch ausgegeben? Oder evtl. besser: Wenn du den eingegebenen String in eine Datei schreibst, sind die Zeichen in der Datei dann schon falsch, oder alles erst beim wieder-einlesen?
Das Problem tritt erst auf, wenn ich den Inhalt der Datei mit den vielen Sonderzeichen wieder in Java einlesen und in die JTextArea schreiben will. Ob die Zeichen in der Datei richtig angezeigt werden hängt davon ab, mit welchem Editor ich sie mir angucke.
Notepad kann z.B. gar nichts (man sieht fast nur blanks). JEdit dagegen zeigt (glaube ich, wie soll man da sicher sein?) alle Sonderzeichen richtig an.

Ich finde die schwierigste Frage ist erstmal, wo genau der eigentliche Fehler entsteht. Vielleicht wird ja die Datei mit einer anderen Codierung gelesen als sie geschrieben wird?

Es gibt zum Beispiel auch die Klasse DataOutputStream mit der Methode writeUTF(String str). Dabei werden angeblich die Zeichen erst intern in UTF-16 dargestellt und dann als UTF-8 geschrieben. Das Äquivalent zum Einlesen wäre dann DataInputStream.

Allerdings ist mir gar nicht klar warum die Daten überhaupt erst noch einmal codiert werden müssen - die 'neue' Codierung ist doch die Chiffrierung. Könnte man dann nicht direkt ein Byte-Array lesen und schreiben?

ctk

Trainee

  • "ctk" is male

Posts: 113

Date of registration: Oct 15th 2004

18

Monday, July 21st 2008, 6:06pm


Source code

1
2
3
4
5
...

  new FileInputStream(chooser.getSelectedFile()), "UTF-8"));

...





Source code

1
2
3
4
5
...
new FileOutputStream(chooser.getSelectedFile()), "Cp850"));

     
...



Da ist doch der Fehler: Du Schreibst mit cp850 und liest mit UTF-8. Du musst dich schon für einen Zeichensatz entscheiden.
Technik ist der Wettlauf der Intelligenz mit der Kreativität der Narren.
Bis heute haben die Narren immer gewonnen.

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

19

Wednesday, July 23rd 2008, 8:45am



Source code

1
2
3
4
5
...

  new FileInputStream(chooser.getSelectedFile()), "UTF-8"));

...





Source code

1
2
3
4
5
...
new FileOutputStream(chooser.getSelectedFile()), "Cp850"));

     
...



Da ist doch der Fehler: Du Schreibst mit cp850 und liest mit UTF-8. Du musst dich schon für einen Zeichensatz entscheiden.
Ne, das habe ich damals beim rumprobieren nur einmalkurz so gehabt. Ich schreibe und lese immer denselben Zeichensatz. Daran liegt es leider nicht!
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin

schmaidt

Junior Schreiberling

  • "schmaidt" is male
  • "schmaidt" started this thread

Posts: 159

Date of registration: Feb 25th 2004

Location: Hannover

Occupation: Aus Interesse

20

Wednesday, July 23rd 2008, 8:48am

RE: RE: RE: RE: Zeichensatz-Probleme in Java


Über Base64 habe ich auch schon nachgedacht. Aber ich möchte gerne, dass man den Chiffretext auch ansehen kann. Das ist ja eine nicht allzu vermessene kryptografische Forderung, oder :P ?
Vermessen nicht, aber IMHO völlig überflüssig. Welchen Nutzen versprichst Du Dir davon?
Der Nutzen ist kryptographischer Natur. Wenn ich zum Beispiel einen Chriffretext erstelle, dann kann es sinnvoll zur Analyse des Kryptosystems sein, den Chriffretext z.B. an einzelnen Stellen zu verändern und die entstehende Veränderung der nach Entschlüsselung entstehenden Klartexte zu analysieren.
"Man kann beweisen, daß der technische Fortschritt besser ist mit Zucker!"
Ionesco, Die kahle Sängerin