Ich habe es mit Code zu tun, der verschiedene IO-Operationen mit Dateien durchführt, und ich möchte, dass er mit internationalen Dateinamen umgehen kann. Ich arbeite an einem Mac mit Java 1.5, und wenn ein Dateiname Unicode-Zeichen enthält, die Surrogate erfordern, scheint die JVM die Datei nicht zu finden. Zum Beispiel meine Testdatei ist:Java kann eine Datei mit Ersatz-Unicode-Werten im Dateinamen nicht öffnen?
"草鷗外.gif"
, die in die Java Zeichen \u8349\uD85B\uDFF6\u9DD7\u5916.gif
kaputt geht, wenn ich eine Datei aus diesem Dateinamen erstellen, kann ich es nicht öffnen, weil ich eine FileNotFound Exception. mit diesem auch auf den Ordner, die Datei enthält, wird fehlschlagen:
File[] files = folder.listFiles();
for (File file : files) {
if (!file.exists()) {
System.out.println("Failed to find File"); //Fails on the surrogate filename
}
}
Die meisten der Code, den ich mit eigentlich zu tun bin von der Form sind:
FileInputStream instream = new FileInputStream(new File("草鷗外.gif"));
// operations follow
Gibt es irgendeine Weise, die ich dieses Problem lösen können, entwischen Sie die Dateinamen oder öffnen Sie die Dateien anders?
Was ist der Wert von Charset.defaultCharset() in Ihrer Umgebung? –
(Leider hat StackOverflow auch ein Problem mit Surrogate und hat den U + 26FF6-Ideographen aus der Frage entfernt) – bobince
Können Sie angeben, was System.getProperty ("file.encoding") zurückgibt? Versuchen Sie, die Codierung java-dfile.encoding = ENCODING_GOES_HERE zu ändern, wenn das Systemgebietsschema nicht geändert wird. Wenn dies auch nicht funktioniert, warten wir auf einen Experten, um es zu lösen. – JCasso