2013-01-05 4 views
7

Mam kilka katalogów/plików z japońskimi znakami. Jeśli spróbuję odczytać nazwę pliku (nie zawartość) zawierającą (jako przykład) a ク, otrzymam ciąg zawierający . Jeśli spróbuję utworzyć plik/katalog zawierający ク, pojawi się plik/katalog zawierający znak.java read write unicode/UTF-8 nazwy plików (nie zawiera)

Jako przykład: Wyświetlam listę plików za pomocą.

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

Tablica filesAndDirs zawiera teraz katalogi znaków specjalnych. Ciąg zawiera teraz tylko . Nie ma nic do odkodowania, ponieważ getbytes pokazuje tylko "-17 -65 -67" dla każdego znaku w nazwie pliku, nawet dla różnych znaków.

Używam MacOS 10.8.2 Java 7_10 i Netbeans.

Wszelkie pomysły?

góry dziękuję :)

+2

Nie jest jasne * jak * wyświetlasz te nazwy plików lub czy podajesz kodowanie dla 'String.getBytes()' (co zawsze powinieneś). Powinieneś zrzucić kod punktu UTF-16 dla każdego znaku w nazwie pliku, aby zobaczyć, co się naprawdę dzieje. Ponadto nie jest jasne, w jaki sposób otrzymujesz dane wejściowe podczas próby utworzenia pliku. –

+0

'getBytes' zwraca to, co wydaje się być poprawne UTF8 –

+1

@Jan Tak, wygląda na poprawny UT8, ale getBytes zwraca" -17 -65 -67 "dla każdego znaku. Ale nie wszystkie znaki w nazwie pliku/katalogu są takie same. Wygląda na to, że tracę wszystkie informacje między systemem operacyjnym a JavaVM. "-17 -65 -67" powtarza się dla każdego znaku specjalnego. [a-zA-Z ...] są zwracane zgodnie z oczekiwaniami. Przynajmniej bym oczekiwał różnych bajtów dla każdego znaku. –

Odpowiedz

2

bajty te są 0xEF 0xbd 0xbf, który jest UTF-8-zakodowane formą \ uFFFD charakterze widzisz zamiast japońskich znaków. Wygląda na to, że jakakolwiek funkcja systemu operacyjnego używa języka Java, aby wyświetlić listę, pliki zwracają te niepoprawne znaki.

Być może Files.newDirectoryStream będzie bardziej niezawodny. Zamiast tego spróbuj tego:

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

działa jak czar :). Teraz muszę tylko dowiedzieć się, jak tworzyć pliki i foldery za pomocą specjalnych znaków. Dziękuję Ci bardzo! –

+0

Spójrz na javadoc dla klasy 'Files'. Ma metody, aby wykonać wszystkie te rzeczy. – VGR

2

To błąd w starym aplecie File Java (może tylko na macu). W każdym razie wszystko jest naprawione w nowym java.nio.

Mam kilka plików zawierających znaki Unicode w nazwie pliku i treści, które nie mogły zostać załadowane przy użyciu pliku java.io.File i powiązanych klas. Po konwersji całego mojego kodu na użytek java.nio.Path WSZYSTKO zaczęło działać. I zamieniłem org.apache.commons.io.FileUtils (z tym samym problemem) z java.nio.Files ...

... i pamiętaj, aby odczytywać i zapisywać zawartość pliku przy użyciu odpowiedniego zestawu znaków, na przykład: Files.readAllLines (myPath, StandardCharsets.UTF_8)