HIIILLLFEEE...Ich gebs bald auf!

Hallo,

nachdem ich jetzt schon über drei Wochen lang nach einer - eigentlich trivialen - Lösung meines Problemes suche und weder in den verschiedensten JAVA-Foren, sowie Bücher eine Antwort darauf finden konnte, ja mir nicht einmal im Forum auf http://www.javasoft.com einer eine passende Anwtort geben konnte, bin ich ernsthaft am Überlegen, mein Programm in C++ zu schreiben, und damit JAVA den Rücken zu kehren!

Wenn Du weißt, wie ich es lösen könnte, hilf mir bitte! Ich wäre unendlich dankbar!! :wink:

Es besteht folgendes Problem: Ich entzippe mit einer Methode ein Zip-Archiv rekursiv… funktioniert einwandfrei, solange im Namen des Zip-Archives selber oder den gepackten Dateinamen keine Umlaute (äöü) vorkommen. Ist dies der Fall, bekomme ich folgende Fehlermeldung:

Exception in thread „main“ java.lang.IllegalArgumentException
at java.util.zip.ZipInputStream.getUTF8String(Unknown Source)
at java.util.zip.ZipInputStream.readLOC(Unknown Source)
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
at mapper.unZip(mapper.java:519)
at mapper.copyDir(mapper.java:228)
at mapper.main(mapper.java:117)

Wenn ich mir das Zipfile ausgeben lasse, dann spuckt JAVA mir an der Konsole ein O mit einer Tilde ~ oben drauf anstatt eines ä aus. Der Charwert beträgt hier -28 anstatt 228 wie es in der Unicode-Tabelle steht. Deshalb funktioniert auch meine zweite Methode nicht, die ByteToChar anwendet, um Unicode zu erhalten.
Ich habe auch schon versucht in einer Schleife die -28 abzufangen und durch 228 (und andere Zeichen entsprechend) zu ersetzen… Fehlanzeige.
Nachfolgend der Code der unZip-Methode:

/** Entpackt ein beliebiges Zip-Archiv rekursiv in angegebenen Pfad
* Archiv darf (noch) keine Umlaute enthalten!
* @param path Pfad zum entzippen
* @param zipfile Name(Pfad) des Zipfiles
* @param delete Gibt an, ob das Zipfile nach dem Entpacken geloescht werden soll
**/
public void unZip(String path, String zipfile, String delete)
{

// Ordner nach ZipFile anlegen
int length = (getName(zipfile)).length();
int cut = length - 4;

String zipfolder = (getName(zipfile)).substring(0, cut);
path = path + „\“ + zipfolder;

mkDir(path);

try
{
// Zip-Datei öffnen
byte[] buf = new byte[4096];
ZipInputStream in = new ZipInputStream(
new FileInputStream(zipfile));

while(true)
{
//Naechsten Zip-Eintrag lesen
ZipEntry entry = in.getNextEntry();
if(entry == null)
break;

System.out.println(„AUSGABE:“ + entry.getName());

// Ordnerstruktur anlegen
if((entry.isDirectory()))
{
File directory = new File(
path + „\“ + entry.getName());
directory.mkdirs();
}
else
{
FileOutputStream out = new FileOutputStream(
path + „\“ + entry.getName());

int len;
while((len = in.read(buf)) > 0)
out.write(buf, 0, len);

out.close();

}

// Zip-Eintrag schliessen
in.closeEntry();
}
in.close();
}
catch(IOException e)
{
System.err.println(e.toString());
}

if(delete.equals(„yes“))
{

System.out.print("\nDeleting…: " + zipfile + „…“);
remove(zipfile);
System.out.print(„OK“);
}
}


Vielen Dank schon mal im Vorraus für die Hilfe!!

Grüsse
Cromo

Gibs nicht auf, denn…
in Java gibt es fuer (fast) alles eine Loesung. Man muss nur die richtigen Leute fragen.

Hallo erstmal.

Also das Problem mit Umlauten hatte ich auch mal. Wenn man sich die Sourcen von JDK anschaut, dann sieht man, wie SUN das Loest. Den folgenden Quelltext habe ich daruas entnommen. Es ist keine direkte Loesung deines Problems, aber es gibt dir eine neue Idee, wie man das Loest. Ich kann dir aus Zeitgrunden nicht alles erklaeren und auch nicht die komplette Loesung praesentieren, etwas musst du ja auch selbst machen. Aber du kannst bei fragen gerne mich kontaktieren.

Jetzt der Code. Es sind zwei Methoden, die von Unicode-16 nach
Unicode-8 umwandeln und umgekehrt. Dazu mommen zwei Hilfsmethoden sowie ein paar Variablen. Ich denke, du solltest damit klar kommen.

private static final String keyValueSeparators = „=: \t\r\n\f“;
private static final String strictKeyValueSeparators = „=:“;
private static final String specialSaveChars = „=: \t\r\n\f#!“;
private static final String whiteSpaceChars = " \t\r\n\f";

/*
* Converts encoded \uxxxx to unicode chars
* and changes special saved chars to their original forms
*/
private String loadConvert (String theString) {
char aChar;
int len = theString.length();
StringBuffer outBuffer = new StringBuffer(len);

for(int x=0; x 0x007e)) {
outBuffer.append(’\’);
outBuffer.append(‚u‘);
outBuffer.append(toHex((aChar >> 12) & 0xF));
outBuffer.append(toHex((aChar >> 8) & 0xF));
outBuffer.append(toHex((aChar >> 4) & 0xF));
outBuffer.append(toHex( aChar & 0xF));
} else {
if (specialSaveChars.indexOf(aChar) != -1)
outBuffer.append(’\’);
outBuffer.append(aChar);
}
}
}
return outBuffer.toString();
}

/**
* Convert a nibble to a hex character
* @param nibble the nibble to convert.
*/
private static char toHex(int nibble) {
return hexDigit[(nibble & 0xF)];
}

/** A table of hex digits */
private static final char[] hexDigit = {
‚0‘,‚1‘,‚2‘,‚3‘,‚4‘,‚5‘,‚6‘,‚7‘,‚8‘,‚9‘,‚A‘,‚B‘,‚C‘,‚D‘,‚E‘,‚F‘
};

Melde dich mal, obs geklappt hat.

JAVA IST GUT!!!

In diesem Sinne,
Franz

Hallo Franz,

vielen Dank für Deine Hilfe! Ich werds gleich mal ausprobieren und dich am Laufenden halten!

Grüsse
Cromo