Vignere - Wo hakt es?

ehrdeh

Mitglied
Hallo Zusammen,

ich bin gerade dabei eine Vigenere-Verschlüsselung zu programmieren.
Ich kann eine Textdatei einlesen und wieder schreiben...

Ich kann auch einen String ver- und wieder entschlüsseln, aber leider funktioniert das in Kombination nicht :(

hier mein Code fürs ein und auslesen (RWcsv.java):

Java:
//CSV als ByteArray einlesen return: STRING
	public String file2String(String fileName) throws IOException
	{
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        BufferedReader in = new BufferedReader( new FileReader(fileName));
        int c;
        while ((c = in.read()) > -1){
            bo.write(c);
            }
        return (new String(bo.toByteArray(),"UTF16"));
    }
	
	public void string2File(String fileName, String msg) throws IOException
	{
		File outputFile = new File(fileName);
		FileWriter fw = new FileWriter(outputFile);
		fw.write(msg);
		fw.close();
	}

hier mein code fürs ver- und entschlüsseln (VigenereCrypt.java):

Java:
	public String enCrypt(String plaintext, String password)
	{
		this.plaintext=plaintext;
		crypttext="";
		textIndex=pwIndex=0;
		
		for (textIndex=0; textIndex < plaintext.length() ;textIndex++)
		{
			debugPWValue= (int) password.charAt(pwIndex);
			debugPlaintextValue= (int) plaintext.charAt(textIndex);
			debugCrypttextValue= (plaintext.charAt(textIndex) + password.charAt(pwIndex)) %codeTable;
			
			crypttext+= (char) ((debugCrypttextValue+codeTable)%codeTable);
			
			pwIndex++;
			if (pwIndex>=password.length())
			{
				pwIndex=0;
			}
		}
		System.out.println("++DEBUG++ sofort entschlüsseln:\n"+deCrypt(crypttext, password));
		return crypttext;
	}
	
	public String deCrypt(String crypttext, String password)
	{
		plaintext="";
		this.crypttext=crypttext;
		textIndex=pwIndex=0;
		
		for (textIndex=0; textIndex < crypttext.length() ;textIndex++)
		{
//			debugPWValue= (int) password.charAt(pwIndex);
//			debugPlaintextValue= (int) crypttext.charAt(textIndex);
//			debugCrypttextValue= (crypttext.charAt(textIndex) - password.charAt(pwIndex)) %codeTable;
			
			plaintext+= (char)((crypttext.charAt(textIndex) - password.charAt(pwIndex)+ codeTable)% codeTable);
						
			pwIndex++;
			if (pwIndex>=password.length())
			{
				pwIndex=0;
			}
		}
		return plaintext;
	}

hier meine main() (in der klasse RWcsv.java)
Java:
	public static void main(String[] args) throws IOException 
	{
//		new Gui();
		
		
		/* 
		 * Debug and Testing
		 */
		 
		RWcsv testRWcsv = new RWcsv();
		VigenereCrypt testCrypt = new VigenereCrypt();
		String path =(System.getProperty("user.home")+"/Eigene Dateien/");
		String password = "aaaa";
		String encrypted= null;
		String decrypted=null;
		
		//data.csv einlesen
		decrypted = testRWcsv.file2String(path+"data.csv");
		System.out.println("++DEBUG++ DATA.CSV eingelesen:\n"+decrypted+"\n");
			
		//verschlüsseln
		encrypted = testCrypt.enCrypt(decrypted, password);
		
		//encrypted.csv schreiben
		testRWcsv.string2File(path+"encrypted.csv", encrypted);
		System.out.println("Hier sollte das gleiche stehn: "+encrypted);
		
		//encrypted.csv auslesen
		encrypted = testRWcsv.file2String(path+"encrypted.csv");
		System.out.println("Hier sollte das gleiche stehn: "+encrypted);
		
//		//entschlüsseln
//		decrypted = testCrypt.deCrypt(encrypted, password);
//		System.out.println("\n++DEBUG++ decrypted: \n"+decrypted+"\n");
//		
//		//decrypted.csv schreiben
////		decrypted=encrypted;
//		testRWcsv.string2File(path+"decrypted.csv",decrypted);
		
	}

ich will UTF16 Dateien einlesen und auch wieder schreiben, aber um das auch in die Praxis umzusetzen, habe ich wohl zu wenig Grundwissen über die Zeichenkodierung in Java...

Es hakt wohl beim schreiben der Dateien (also die methode string2File)
zumindest erwarte ich das da...., sitze schon nen tag am debuggen und sehe nicht was ich falsch mache...
 
B

bone2

Gast
Was 'funktioniert' denn nicht? Wird keine Datei erzeugt? Ist die Datei leer? Steht das Falsche oder zu kurzer Text n der Datei?
 

ehrdeh

Mitglied
oh ja :D

es steht etwas falsches in der datei, ein bsp:

Aus data.csv:
Stunde;Montag;Dienstag;Mittwoch;Donnerstag;Freitag
1;Mathe;Deutsch;Englisch;Mathe;Kunst
2;Sport;Franzoesisch;Geschichte;Sport;Geschichte
3;Sport;Religion ev/kath;Kunst;Deutsch;Kunst
4;ABCDE;abcde;0123456789;zyxwvuts;ZYXWVUTS

wird (encrypted.csv)
´ÕÖÏÅÆ?®ÐÏÕÂÈ?¥ÊÆÏÔÕÂÈ?®ÊÕÕØÐÄÉ?¥ÐÏÏÆÓÔÕÂÈ?§ÓÆÊÕÂÈnk??®ÂÕÉÆ?¥ÆÖÕÔÄÉ?¦ÏÈÍÊÔÄÉ?®ÂÕÉÆ?¬ÖÏÔÕnk??´ÑÐÓÕ?§ÓÂÏÛÐÆÔÊÔÄÉ?¨ÆÔÄÉÊÄÉÕÆ?´ÑÐÓÕ?¨ÆÔÄÉÊÄÉÕÆnk??´ÑÐÓÕ?³ÆÍÊÈÊÐÏ?Æ×?ÌÂÕÉ?¬ÖÏÔÕ?¥ÆÖÕÔÄÉ?¬ÖÏÔÕnk??¢£¤¥¦?ÂÃÄÅÆ????????????ÛÚÙØ×ÖÕÔ?»º¹¸·¶µ´


und daraus wird:
tneMnaÞintgMtwcÞonrtgFetg
ÞahÞetcÞnlshMteKnt
ÞprÞrn?shGshctÞprÞecihe
ÞprÞeiineÞahKntDushKnt
ÞBDÞbdÞÞÞÞÞÞz?tÞYWUS


ich hatte es schon soweit, dass es mit codeTable = 128; aber irgendwie hab i auch das kaputtgedebuggt
 
Zuletzt bearbeitet:
S

SlaterB

Gast
etwas mit was auch immer zu verschlüsseln ---------------------------------------------- und etwas in eine Datei zu schreiben sind komplett unterschiedliche Dinge,
wieso mischt du das hier zusammen? wieso steht im Titel 'Vignere' statt 'wie schreibe ich einen String in eine Datei?'?
wieso erzählst du erst dass es wohl an der Datei liegt, dann aber wieder von codeTable = 128; ...

bevor du ein Programm oder ein Forumpost schreiben kannst musst du doch erstmal den Kopf klar bekommen, überlegen worum es überhaupt geht..


verwende zum Lesen und Schreiben folgendes,
und wenn zur Verschlüsselung noch was offen ist, teste das zunächst NUR mit vorgegebenen Strings im Programm + Ausgabe per System.out.println()
Java:
public class Test {
    public static void main(String[] args)   throws IOException  {
        String st = "Hello\nWorld";
        String file = "test.txt";
        string2File(file,st);
        System.out.println(file2String(file));
    }

    public static String file2String(String fileName)  throws IOException  {
        File f = new File(fileName);
        FileInputStream fin = new FileInputStream(f);
        InputStreamReader in = new InputStreamReader(fin, "UTF16");
        BufferedReader bin = new BufferedReader(in);

        // bisschen aufwendige Schleife, wenn es wer kürzer kennt Bescheid sagen, 
        // abgesehen von char[] + Schleife
        StringBuilder b = new StringBuilder();
        String line = bin.readLine();
        b.append(line);
        while ((line = bin.readLine()) != null)
        {
            b.append("\n");
            b.append(line);
        }
        bin.close();
        return b.toString();
    }

    public static void string2File(String fileName, String msg)  throws IOException {
        File f = new File(fileName);
        FileOutputStream fout = new FileOutputStream(f);
        OutputStreamWriter ow = new OutputStreamWriter(fout, "UTF16");
        ow.write(msg);
        ow.close();
    }
}
 
Zuletzt bearbeitet von einem Moderator:

ehrdeh

Mitglied
Erstmal Danke für die Hilfe

Ich habe die Beiden methoden string2file und file2string natürlich vorher getestet (also ohne es zu verschlüsseln)

und danach sind die beiden dateien identisch
Wenn ich nur verschlüssel ohne in eine Datei zu schreiben, funzt es auch ganz prima.... nur das zusammenspiel funzt irgendwie net...

Also
ersteDatei.csv lesen
zweiteDatei.csv schreiben
danach sind die beiden dateien gleich


aber:
ersteDatei zu String
String verschlüsseln
verschlüsselteDatei schreiben

verschlüsselteDatei lesen
entschlüsseln
entschlüsselteDatei schreiben

dann sind ersteDatei und verschlüsselteDatei unterschiedlich



Wenn ich aber in der mainmethode nur "vorgefertigte STrings "nehme und diese ver und entschlüssele dann funzt es ebenfalls


hoffe es wurde klar warum ich Vigenere in den Titel geschrieben hab

mit deiner einlesefkt klappt es leider auch nicht :/
 
S

SlaterB

Gast
nun gut, dann will ich mal nach meinen Gemaecker auch verstärkt helfen, poste aber bitte mehr Code von Vignere,
ich habe versucht die Methoden zu kopieren aber da fehlen jede Menge Klassenattribute usw.

sollen die verschlüsselten Daten eigentlich lesbarer Text sein? gilt das für die Originale?
vielleicht alles auf bytes umstellen, InputStreams statt Reader, byte[] stat Strings usw.,
 

ehrdeh

Mitglied
hier der komplette vigenere

Java:
public class VigenereCrypt {

	final static int codeTable = 256; //2^8 for UTF-8!
	private String plaintext,crypttext;
	Integer textIndex,pwIndex;
	Integer debugPWValue, debugPlaintextValue, debugCrypttextValue;
	public VigenereCrypt()
	{
		
	}
	
	public String enCrypt(String plaintext, String password)
	{
		this.plaintext=plaintext;
		crypttext="";
		textIndex=pwIndex=0;
		
		for (textIndex=0; textIndex < plaintext.length() ;textIndex++)
		{
			debugPWValue= (int) password.charAt(pwIndex);
			debugPlaintextValue= (int) plaintext.charAt(textIndex);
			debugCrypttextValue= (plaintext.charAt(textIndex) + password.charAt(pwIndex)) %codeTable;
			
			crypttext+= (char) ((debugCrypttextValue+codeTable)%codeTable);
			
			pwIndex++;
			if (pwIndex>=password.length())
			{
				pwIndex=0;
			}
		}
//		System.out.println("++DEBUG++ sofort entschlüsseln:\n"+deCrypt(crypttext, password));
		return crypttext;
	}
	
	public String deCrypt(String crypttext, String password)
	{
		plaintext="";
		this.crypttext=crypttext;
		textIndex=pwIndex=0;
		
		for (textIndex=0; textIndex < crypttext.length() ;textIndex++)
		{
//			debugPWValue= (int) password.charAt(pwIndex);
//			debugPlaintextValue= (int) crypttext.charAt(textIndex);
//			debugCrypttextValue= (crypttext.charAt(textIndex) - password.charAt(pwIndex)) %codeTable;
			
			plaintext+= (char)((crypttext.charAt(textIndex) - password.charAt(pwIndex)+ codeTable)% codeTable);
						
			pwIndex++;
			if (pwIndex>=password.length())
			{
				pwIndex=0;
			}
		}
		return plaintext;
	}
	
	public static void main(String[] args) {
		VigenereCrypt testCrypt= new VigenereCrypt();
		String pass ="aaaa";
		String msg ="Stüüunde;Montag;Dienstag;Mittwoch;Donnerstag;Freitag\n1;Mathe;Deutsch;Englisch;Mathe;Kunst\n2;Sport;Französisch;Geschichte;Sport;Geschichte\n3;Sport;Religion ev/kath;Kunst;Deutsch;Kunst\n4;ABCDE;abcde;0123456789;zyxwvuts;ZYXWVUTS";
		
		System.out.println("\n Verschlüsselt: "+testCrypt.enCrypt(msg,pass));
		System.out.println("\n entschlüsselt:\n"+testCrypt.deCrypt(testCrypt.enCrypt(msg,pass),pass));

	}

}


ich dachte es wäre vllt. hilfreich, wenn man nicht alles kopiert, wegen der übersichtlichkeit...
aber erfahrenen codern macht das wahrscheinlich nix aus :D


an ein byte-array hatte ich auch schon gedacht, aber ich fand es irgendwie eleganter, gleich strings zu übergeben....
aber vllt. hätte ich mit nem bytearray wesentlihc weniger probs
 
Zuletzt bearbeitet:
S

SlaterB

Gast
hmm, bei mir scheint
Java:
        String v = testCrypt.enCrypt(msg, pass);
        System.out.println("\n Verschlüsselt1: " + v);
        String file = "test.txt";
        string2File(file,v);
        
        v = file2String(file);
        System.out.println("\n Verschlüsselt2: " + v);
        
        
        System.out.println("\n entschlüsselt:\n" + testCrypt.deCrypt(v, pass));
zu funktionieren,
also wenn ich meine Methoden nehmen, nicht deine beiden vom ersten Post, mit denen gehts schief ;)

was passiert bei dir denn wenn du den verschlüsselten Text zwischenspeicherst oder wo genau besteht das Speicher-Problem?
 

ehrdeh

Mitglied
ich hab keine ahnung warum, aber auf einmal gehts....

vllt. bin ich irgendwo mit der reihenfolge der methodenaufrufe durcheinander gekommen
aber hiermit funzt es:
Java:
		RWcsv testRWcsv = new RWcsv();
		VigenereCrypt testCrypt = new VigenereCrypt();
		String path =(System.getProperty("user.home")+"/Eigene Dateien/");
		String password = "aaaa";
		String encrypted= null;
		String decrypted=null;
		
		//einlesen-verschlüsseln-schreiben-einlesen-entschlüsseln-schreiben
		//verschlüsseln
		decrypted = testRWcsv.file2String(path+"data.csv");
		encrypted = testCrypt.enCrypt(decrypted, password);
		testRWcsv.string2File(path+"encrypted.csv", encrypted);
		//entschlüsseln
		encrypted = testRWcsv.file2String(path+"encrypted.csv");
		decrypted = testCrypt.deCrypt(encrypted, password);
		testRWcsv.string2File(path+"decrypted.csv",decrypted);
 
S

SlaterB

Gast
umso besser, noch eine Korrektur meiner Einlese-Methode: die fügt am Ende immer ein \n dran auch an die letzte Zeile,
das ist nicht so schön, werde mein Posting weiter oben gleich noch editieren
 

ehrdeh

Mitglied
Da dachte ich, es wäre vorbei und alles schön und aufeinmal will ichs utf-8 kompatibel

Also erstmal der Code(RWcsv.java):
[Java]
public class RWcsv {

private ArrayList<Dataset> rows = new ArrayList<Dataset>();
// CeasarCrypt cryptIT = new CeasarCrypt(); //CeasarChiffre (cp= verschieben um)
// private int cp=-7
VigenereCrypt cryptIT = new VigenereCrypt(); //VigenereChiffre (cp = password)
String cp="testpw";


//Default-Constructor
public RWcsv()
{
}
public static void main(String[] args) throws IOException
{
// new Gui();
/*
* Debug and Testing
*/

RWcsv testRWcsv = new RWcsv();
VigenereCrypt testCrypt = new VigenereCrypt();
String path =(System.getProperty("user.home")+"/Eigene Dateien/");
String password = "aaaa";
String encrypted= null;
String decrypted=null;

//einlesen-verschlüsseln-schreiben-einlesen-entschlüsseln-schreiben
//verschlüsseln
decrypted = testRWcsv.file2String(path+"csvUTF8.csv");
System.out.println("++ DEBUG ++\n"+decrypted);
encrypted = testCrypt.enCrypt(decrypted, password);
testRWcsv.string2File(path+"encryptedUTF8.csv", encrypted);
System.out.println("2 mal das gleiche: "+encrypted);
//entschlüsseln
encrypted = testRWcsv.file2String(path+"encryptedUTF8.csv");
System.out.println("2 mal das gleiche: "+encrypted);
decrypted = testCrypt.deCrypt(encrypted, password);
System.out.print("und hier entschlüsselt\n"+decrypted);
testRWcsv.string2File(path+"decryptedUTF8.csv",decrypted);

// //einlesen- schreiben - auslesen - schreiben
// decrypted= testRWcsv.file2String(path+"csvUTF8.csv");
// testRWcsv.string2File(path+"encryptedUTF8.csv", decrypted);
// System.out.println(decrypted);
// encrypted= testRWcsv.file2String(path+"encrypted.csv");
// testRWcsv.string2File(path+"decryptedUTF8.csv",encrypted);
// System.out.println("\n\n"+encrypted);

}

//CSV einlesen return: STRING
public String file2String(String fileName) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(new File(fileName)));

// bisschen aufwendige Schleife, wenn es wer kürzer kennt Bescheid sagen,
// abgesehen von char[] + Schleife
StringBuilder b = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
b.append(line);
b.append("\n");
}
br.close();
return b.toString();
}

public void string2File(String fileName, String msg) throws IOException {
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
fw.write(msg);
fw.close();
}
}
[/Java]

und hier der Vigenere code

[Java]
public class VigenereCrypt {

final static int codeTable = 128; //2^8 for UTF-8!
private String plaintext,crypttext;
Integer textIndex,pwIndex;
Integer debugPWValue, debugPlaintextValue, debugCrypttextValue;
public VigenereCrypt()
{

}

public String enCrypt(String plaintext, String password)
{
this.plaintext=plaintext;
crypttext="";
textIndex=pwIndex=0;

for (textIndex=0; textIndex < plaintext.length() ;textIndex++)
{
debugPWValue= (int) password.charAt(pwIndex);
debugPlaintextValue= (int) plaintext.charAt(textIndex);
debugCrypttextValue= (plaintext.charAt(textIndex) + password.charAt(pwIndex)) %codeTable;

crypttext+= (char) ((debugCrypttextValue)%codeTable);

pwIndex++;
if (pwIndex>=password.length())
{
pwIndex=0;
}
}
return crypttext;
}

public String deCrypt(String crypttext, String password)
{
plaintext="";
this.crypttext=crypttext;
textIndex=pwIndex=0;

for (textIndex=0; textIndex < crypttext.length() ;textIndex++)
{
// debugPWValue= (int) password.charAt(pwIndex);
// debugPlaintextValue= (int) crypttext.charAt(textIndex);
// debugCrypttextValue= (crypttext.charAt(textIndex) - password.charAt(pwIndex)) %codeTable;

plaintext+= (char)((crypttext.charAt(textIndex) - password.charAt(pwIndex)+codeTable)% codeTable);

pwIndex++;
if (pwIndex>=password.length())
{
pwIndex=0;
}
}
return plaintext;
}

public static void main(String[] args) {
VigenereCrypt testCrypt= new VigenereCrypt();
String pass ="aaaa";
String msg ="Stüüunde;Mo ntag;Dienstag ;Mittw och;Donnerstag;F reitag\n1;Mathe;Deutsch;Englisch;Mathe;Kunst\n2;Sport;Französisch;Geschichte;Sport;Geschichte\n3;Sport;Religion ev/kath;Kunst;Deutsch;Kunst\n4;ABCDE;abcde;0123456789;zyxwvuts;ZYXWVUTS";

System.out.println("\n Verschlüsselt: "+testCrypt.enCrypt(msg,pass));
System.out.println("\n entschlüsselt:\n"+testCrypt.deCrypt(testCrypt.enCrypt(msg,pass),pass));

}

}
[/Java]


Wenn ich jetzt diese Datei verschlüssel mit codeTable =128:
Stunde;Montag;Dienstag;Mittwoch;Donnerstag;Freitag
1;Mathe;Deutsch;Englisch;Mathe;Kunst
2;Sport;Französisch;Geschichte;Sport;Geschichte
3;Sport;Religion ev/kath;Kunst;Deutsch;Kunst
4;ABCDE;abcde;0123456789;zyxwvuts;ZYXWVUTS

kommt das dabei heraus:
Stunde;Montag;Dienstag;Mittwoch;Donnerstag;Freitag
1;Mathe;Deutsch;Englisch;Mathe;Kunst
2;Sport;FranzC6sisch;Geschichte;Sport;Geschichte
3;Sport;Religion ev/kath;Kunst;Deutsch;Kunst
4;ABCDE;abcde;0123456789;zyxwvuts;ZYXWVUTS
)


keine umlaute, ist ja auch quasi ascii-verschlüsselung, wenn ich aber codeTable = 256 mache,
dann kommt das dabei raus:
StundeÞMontagÞDienstagÞMittwochÞDonnerstagÞFreitag
ÞÞMatheÞDeutschÞEnglischÞMatheÞKunst
ÞÞSportÞFranzösischÞGeschichteÞSportÞGeschichte
ÞÞSportÞReligionÞevÞkathÞKunstÞDeutschÞKunst
ÞÞABCDEÞabcdeÞÞÞÞÞÞÞÞÞÞÞÞzyxwvutsÞZYXWVUTS
©

kann mir einer erklären, warum ich semikoli und zahlen nicht mehr anständig verschlüsseln kann? achja ö auch net

habe da ein verständnis prob
danke im vorraus
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die ) bzw. das @ am Ende liegt an der von mir falschen read-Schleife,
wie 10:57 bereits drauf hingewiesen und in der Antwort von 10:08 dann editiert

beim Rest kann ich noch keinen Fehler nachvollziehen, die main-Methode von VigenereCrypt geht auch nicht?

bei RWcsv.main versuche
Java:
        decrypted = ";";
        p("dec0 ", decrypted);
        encrypted = testCrypt.enCrypt(decrypted, password);
        p("enc 1", encrypted);
        testRWcsv.string2File(path + "encryptedUTF8.csv", encrypted);
        encrypted = testRWcsv.file2String(path + "encryptedUTF8.csv");
        p("enc 2", encrypted);
        decrypted = testCrypt.deCrypt(encrypted, password);
        p("dec3 ", decrypted);

mit

    private static void p(String info, String st)
    {
        System.out.println(info + ": " + st + ", " + (int)st.charAt(0));
    }
Ausgabe bei mir bei 256:
Code:
dec0 : ;, 59
enc 1: œ, 156
enc 2: œ, 156
dec3 : ;, 59
den verschlüsselten Text kann man gewohnt nicht lesen, Entschlüsselung geht aber

oder hast du ein Problem mit der erstellten CSV-Datei?
 

ehrdeh

Mitglied
jup die csv dateien...
wenn ich die methoden in der klasse vigenere aufrufe geht alles


nur lesen schreiben geht und nur verschlüsseln geht auch
Dieser Output kommt in der decryptUTF8.csv zustande, wenn ich die main() aus der RWcsv.java sowie gepostet ausführe

StundeÞMontagÞDienstagÞMittwochÞDonnerstagÞFreitag
ÞÞMatheÞDeutschÞEnglischÞMatheÞKunst
ÞÞSportÞFranzösischÞGeschichteÞSportÞGeschichte
ÞÞSportÞReligionÞevÞkathÞKunstÞDeutschÞKunst
ÞÞABCDEÞabcdeÞÞÞÞÞÞÞÞÞÞÞÞzyxwvutsÞZYXWVUTS
©

; und [0-9] werden wohl nicht richtig übersetzt und ö auch net :/
und da weiss ich net warum...


EDIT: wenn ich nur die Vigenere ausführe (also die main() nehme)
dann übersetzt er korrekt, allerdings bildet er bei mit ; auf ? ab
übersetzt es aber auch zurück wieder richtig


kann es sein, dass das irgendwas mit globaleren einstellungen zu tun hat?
gibt es sowas wie eine standardkodierung im System? so dass er vllt bei mir ne andere kodierung beim ein und auslesen wählt?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
nun, ich kann es weiterhin nicht nachvollziehen,
wenn möglich sende als Anhang deine Originaldatei, die erstellte csv-Datei mit den ÞÞ
und vielleicht einen Screenshot wie das bei dir aussieht und in welchem Programm
 
S

SlaterB

Gast
also in der Datei steht für ";" an Stelle von Byte 59 ein Byte -34,
ich habe keine Idee wie es dazu kommen kann,

was liefert
Java:
        String decrypted = "St;;;o";
        System.out.println(Converters.getDefaultEncodingName());
        System.out.println(Arrays.toString(decrypted.getBytes()));
        System.out.println(Arrays.toString(decrypted.getBytes("ISO-8859-1")));
        char[] ch = decrypted.toCharArray();
        for (char c : ch)
        {
            System.out.println((int)c);
        }
bei dir?
Code:
UTF-8
[83, 116, 59, 59, 59, 111]
[83, 116, 59, 59, 59, 111]
83
116
59
59
59
111
wäre nicht schlecht, 59 halt statt -34...

du kannst in deinem Programm noch weitere ähnliche Ausgaben einbauen, ob irgendwo -34 auftaucht,

wenn String.getBytes() bei dir auch 59 liefert, dann versuche FileOutputStream und dort die bytes direkt zu schreiben,
aber eine Lösung wäre das ja nicht..

Betriebssystem ist WinXP?, nicht zufällig 64bit statt 32bit oder ähnlich böses?

----

versuche auch wieder meine geposteten write/read-Methoden, nur dann mit Angabe UTF8 statt UTF-16,
damit umgehst du vielleicht den impliziten Standard, was immer der bei dir anders macht

und wie gesagt ist das © wegen falsche read-Schleife von mir, in diesem Thread steht aber nur noch die richtige (edit: in meinen Postings)
 
Zuletzt bearbeitet von einem Moderator:

preachie

Aktives Mitglied
Das Problem wird am FileWriter liegen, da dieser die Daten nicht UTF-8 encoded wegschreibt sondern mi dem System Default-Encoding, was auf Windows im Normalfall Cp1252 ist.
Du kannst ja selbst sehen, dass die Datei im falschen Encoding geschrieben wurde, wenn Du Dir Deinen Screenshot encryptedUTF8.JPG ansiehst. Unten rechts in dem PSPad steht Kodierung: ANSI (und nicht wie es sein müsste UTF-8).

Daher statt des FileWriter nen OutputStreamWriter verwenden und das gewünschte Encoding mit übergeben, so wie es slater weiter oben schon vorgeschlagen hat.

Paar Links dazu (inkl. alten Threads in den slater auch schon aktiv war ;) )
http://www.java-forum.org/allgemeine-java-themen/50744-umlaute-filewriter-vs-fileoutputstream.html
http://www.java-forum.org/allgemeine-java-themen/50351-platforms-default-character-encoding.html
Java FileWriter, XML and UTF-8 | Angus Thinks…
 

ehrdeh

Mitglied
danke euch beiden,
ich werde es morgen gleich ausprobieren...

zu Hause habe ich nur ubuntu, das prog ist für mein praktikum bei dem ich wirklich windows xp verwende :D

auf so ein windows-standard-mist habe ich ja auch schon getippt... allerdings war ich mir nicht sicher

nochmal 1000 dank euch beiden :D, gerade für die Erklärungen

ps: auf erledigt kann ich wohl erst morgen klicken wenn ich mir sicher bin, dass es das war

edit:
Juhu es geht, schön das es die ganze Zeit auf richtigen Betriebssystemen, vllt. sogar auf nem mac funktioniert hätte... das die aus redmont auch immer was eigenes machen müssen...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ah, jetzt habe ich endlich auch den Weg,
Cp1252 hatte ich auch versucht, aber nur das ";" direkt zu speichern und da kommt nicht -34 aus,
erst wenn man auch den encrypted-Text so speichert, dann gehts am Ende schief,

tja, damit hätte ich rechnen sollen, wieder mal drauf verlassen dass ehrdeh das selber gesehen hätte ;)
denn dann gibts nämlich schon einen Unterschied beim Einlesen von encrypted:
Code:
2 mal das gleiche: ´ÕœœœÐ
2 mal das gleiche: ´Õ???Ð
und hier entschlüsselt
StÞÞÞo
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben