2013-01-05 14 views
7

Ho alcune directory/file con caratteri giapponesi. Se provo a leggere un nome di file (non il contenuto) contenente (ad esempio) a ク ricevo una stringa contenente un . Se provo a creare un file/directory contenente un file un file/directory appare contenente un?.java read write unicode/nome file UTF-8 (non contenuto)

Come esempio: I elenca i file con.

File file = new File("."); 
String[] filesAndDirs = file.list(); 

l'array filesAndDirs contiene ora le directory questo i caratteri speciali. La stringa ora contiene solo . Sembra che non ci sia nulla da decodificare perché un getbytes mostra solo "-17 -65 -67" per ogni carattere nel nome del file anche per caratteri diversi.

Uso MacOS 10.8.2 Java 7_10 e Netbeans.

Qualche idea?

ringraziare in anticipo :)

+2

Non è chiaro * come * stai mostrando quei nomi di file o se stai fornendo una codifica per 'String.getBytes()' (che devi sempre). Dovresti scaricare il punto di codice UTF-16 per ogni carattere nel nome del file, per vedere cosa sta realmente accadendo. Inoltre, non è chiaro come stavi ottenendo i dati di input quando provi a creare il file. –

+0

'getBytes' restituisce ciò che sembra essere valido UTF8 –

+1

@Jan Sì sembra UT8 valido ma getBytes restituisce" -17 -65 -67 "per ogni carattere. Ma non tutti i caratteri nel nome del file/della directory sono gli stessi. Sembra che perdo tutte le informazioni tra il sistema operativo e JavaVM. "-17 -65 -67" viene ripetuto per ogni carattere speciale. [a-zA-Z ...] vengono restituiti come previsto. Mi aspetterei almeno diversi byte per ogni carattere. –

risposta

2

Quei byte sono 0xEF 0xbd 0xBF, che è la forma UTF-8-encoded del carattere \ uFFFD che stai vedendo al posto dei caratteri giapponesi. Sembra che qualsiasi funzione OS utilizzata da Java per elencare i file stia effettivamente restituendo quei caratteri errati.

Forse Files.newDirectoryStream sarà più affidabile. Prova a modificare:

try (DirectoryStream<Path> dir = Files.newDirectoryStream(Paths.get("."))) { 
    for (Path child : dir) { 
     String filename = child.getFileName().toString(); 

     System.out.println("name=" + filename); 
     for (char c : filename.toCharArray()) { 
      System.out.printf("%04x ", (int) c); 
     } 
     System.out.println(); 
    } 
} 
+1

funziona come un fascino :). Ora devo solo scoprire come creare file e cartelle con caratteri speciali. Grazie mille! –

+0

Dai un'occhiata a javadoc per la classe 'Files'. Ha metodi per fare tutte queste cose. – VGR

2

Si tratta di un bug nel vecchio Java API File (forse solo su Mac). Ad ogni modo, è tutto risolto nel nuovo java.nio.

Ho diversi file contenenti caratteri Unicode nel nome file e contenuto che non è riuscito a caricare utilizzando java.io.File e classi correlate. Dopo aver convertito tutto il mio codice per usare java.nio.Path TUTTO ha iniziato a funzionare. E ho sostituito org.apache.commons.io.FileUtils (che ha lo stesso problema) con java.nio.Files ...

... e assicurati di leggere e scrivere il contenuto del file utilizzando un set di caratteri appropriato, ad esempio: Files.readAllLines (myPath, StandardCharsets.UTF_8)

Problemi correlati