2015-02-19 1 views
0

Когда я разархивирую zip-файл в java, я вижу странное поведение с подчеркнутым символом в имени файлов.Java unzip странный символ (кодировка?)

Syso:

Добавить пользователя Файл: L'Equipe Техника - Папка: спецификации Eval продолжить - Название файла: Capture d'ECRAN 2013-05-29 à 17.24.03.png

Если напечатать строку, мы не видим какой-либо вопрос, но когда я отобразить символ из строки, я получил это:

C aptured 'е CRAN

Вместо того, чтобы:

С а р т у г е д»е С Р А Н

Это вызывает проблемы при написании строки в базе данных. Я не создаю архив, но у меня нет проблем с его открытием с помощью моих инструментов ОС. Это может быть проблемой кодирования, но я не вижу, как ее решить ...

BufferedInputStream bis = new BufferedInputStream(is); 
     ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(bis); 

     ArchiveEntry entry = null; 
     // Parcours des entrées de l'archive 
     while((entry = ais.getNextEntry()) != null) { 
      System.out.println("Test one"); 
      // on va essayer de ne pas traiter les dossier 
      if (!entry.isDirectory()) { 
       String[] filePath = entry.getName().split("/"); 
       List<String> filePathList = new ArrayList<String>(); 
       for (int i=0; i<filePath.length; i++) { 
        filePathList.add(filePath[i]); 
       } 

       // on recupere le dossier qui doit contenir le fichier 
       Folder targetFolder = getTargetFolder(filePathList.subList(0, filePathList.size()-1), rootFolder, user, scopeGroupId); 

       String targetFileName = ""; 
       targetFileName = filePathList.get(filePathList.size()-1); 

       //Ajout du fichier 
       final int BUFFER = 2048; 

       FileCacheOutputStream myFile = new FileCacheOutputStream(); 
       int count; 
       byte data[] = new byte[BUFFER]; 
       while ((count = ais.read(data, 0, BUFFER)) != -1) { 
        myFile.write(data, 0, count); 
       } 
       System.out.println("Add File user : "+user.getFullName()+" -- Folder : "+targetFolder.getName()+" -- File Name : "+targetFileName); 
       addFile(user, targetFolder, targetFileName, myFile.getBytes()); 
      } 
     } 
+0

«Если я печатаю строку, мы не видели никаких проблем, но когда я показываю символ из строки« Что это значит? Как вы «отображаете символ из строки»? Я вижу, что вы делаете 'System.out.println', но что такое параметр' file.encoding' для Java и какой терминал вы печатаете для использования и ожидания? –

+0

Я «отображаю символ из строки» с помощью цикла, используя длину строки и печатаю символы один за другим. Я думал, что показ того, как я печатал их, был не очень интересным. Как указал RealSkeptic, это не имеет никакого отношения к кодированию в конце. Только акцентированный характер. – Marc

+0

Способ печати может иметь значение, поскольку проблема может быть в данных в строке или в том, как ваш терминал интерпретирует вывод из Java (используют ли они одну и ту же кодировку?) Или в шрифте, который использует терминал для его отображения , В этом случае он сочетал диакритические знаки и прекомбинированные символы, а нормализация - ответ, но в других случаях это не так. –

ответ

1

акцентированные символы, могут быть выражены в более чем одним способом, в Unicode. У вас может быть предварительно объединенный é, или обычный e, а затем , сочетающий акцент.

В вашем случае имя файла создается с использованием второго метода. Если сортировка базы данных не учитывает это, или база данных не сохраняется в Юникоде, это может стать проблемой.

Вы можете использовать класс Normalizer для преобразования между двумя формами. Например:

String normStr = Normalizer.normalize (origStr,Normalizer.Form.NFC); 
+0

Спасибо, сэр, это именно то, что я искал. Задача решена ! – Marc