Hey,
es ist in etwa ähnlich wie das Problem aus meinem letzten Thread, nur das ich diesmal keine unicodes benutzen kann (Dachte damit könnte ich das lösen).
Also das Problem ist folgendes:
Ich habe einen riesigen Musik-Ordner, den ich immer mal wieder durchgehe und meine derzeitigen Lieblingslieder rauskopiere. Damit das deutlich angenehmer ist (Man nicht nur auf Namen schauen muss sondern auch kurz reinhören kann), habe ich den kompletten Ordner in VLC hinzugefügt und durch durchhören die Leider gefiltert und das ganze dann als xspf-Datei gespeichert (Ist im Grunde ne XML-Datei). Da ich das ganze öfters mache und immer andere Lieder drinne sind hab ich das ganze automatisiert. Dazu filtere ich aus der Datei die einzelnen Pfade raus und kopiere nur diese in nen neuen, vordefinierten Ordner, den ich dann hören kann. Allerdings kodiert der VLC Sonderzeichen und Umlaute, die wenn ich sie einfach kopieren wollen würde zu Fehlern führen, da ich diese erst zurückumwandeln muss.
Allerdings habe ich keine wirklich zuverlässige Möglichkeit dafür gefunden, ich hab durch googlelei und ausprobiererei paar De/Encoder ausprobiert und der bisher beste war der java.net.URLDecoder. Allerdings macht der es nicht 100% korrekt. Als Beispiel:
Die Kopier-klasse schaut so aus (alles per hand eingetragen):
public static void main(String[] args) {
int anzahlDateien = 0;
final File playlistDest = new File("D:\\Musik\\Musik-Oberordner\\Playlist.xspf");
final File newDir = new File("D:\\Musik\\Musik-Oberordner\\VLC-Kopie");
if (!newDir.exists()) {
newDir.mkdir();
} else {
deleteFiles(newDir);
}
String curLine;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(playlistDest)))) {
while ((curLine = br.readLine()) != null) {
if (curLine.contains("<location>")) {
StringBuilder sb = new StringBuilder(curLine.trim());
curLine = sb.replace(0, sb.indexOf("file:///") + 8, "")
.replace(sb.indexOf("</location>"), sb.length(), "").toString()
.replace("%20", " ")
.replace("&", "&")
.replace("%2C", ",")
.replace("%27", "'")
.replace("'", "'")
.replace("%C3%BC", "ü")
.replace("%C3%9C", "Ü")
.replace("%C3%A4", "ä")
.replace("%C3%84", "Ä")
.replace("%C3%A9", "é")
.replace("%C3%A1", "á")
.replace("%5B", "[")
.replace("%28", "(")
.replace("%29", ")")
.replace("%23", "#")
.replace("%21", "!")
.replace("%C3%9F", "ß")
.replace("%26", "&")
.replace("%C2%B4", "´")
.replace("%C3%B6", "ö")
.replace("o%CC%88", "ö")
.replace("%E2%84%A2", "™")
.replace("%E2%88%9E", "∞")
.replace("%5D", "]");
if (!curLine.contains("/Maria/")) {
System.out.println((++anzahlDateien) + ": " + curLine);
Files.copy(Paths.get(curLine),
Paths.get(newDir.getPath() + "\\" + new File(curLine).getName()),
StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING);
}
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println();
System.out.println("Es wurden " + anzahlDateien + " Dateien kopiert!");
}
private static void deleteFiles(File dir) {
for (File f : dir.listFiles()) {
if (f.isDirectory()) {
deleteFiles(f);
}
f.delete();
}
}
Wie man sieht wird aus “&” “& amp;” und aus “,” “%2C”. Der URLDecoder macht nun aus Beispielsweise den “%2C” korrekt das “,”, aber beim “&” macht er einfach “%26” draus, also aus dem “& amp;” macht er einfach nix mit… GIbts ne Klasse die das schon vornherein macht, oder muss ich alle weiteren Fälle auch per Hand eintragen?
String umzuwandeln = "&,'";
String back = URLEncoder.encode(umzuwandeln, "utf-8");
System.out.println("Umgewandelt: " + back);
String neu = URLDecoder.decode("&", "utf-8");
System.out.println("Zurück: " + neu);
Ausgabe ist:
Umgewandelt: %26%2C%27
Zurück: &