2014-09-30 3 views
0

Я пытаюсь создать zip с папками внутри него, и я должен дезинфицировать имена папок против любых незаконных символов. Я сделал некоторые прибегая к помощи вокруг и нашел этот метод из http://www.rgagnon.com/javadetails/java-0662.html:Как заменить незаконные символы в имени файла?

public static String sanitizeFilename(String name) { 
    return name.replaceAll("[\\\\/:*?\"<>|]", "-"); 
} 

Однако при тестировании я получаю некоторые странные результаты. Например:

name = filename£/?e>"e 

должен вернуть filename£--e--e от моего понимания. Но вместо этого он возвращает filename-ú--e--e

Почему это так?

Обратите внимание, что я тестирую это, открывая загруженный zip-файл в WinZip и просматривая имя папки, которая создана. Я не могу получить знак фунта. Я также попытался это:

public static String sanitizeFilename(String name) { 
    name = name.replaceAll("[£]", "\u00A3"); 
    return name.replaceAll("[\\\\/:*?\"<>|]", "-"); 
} 

EDIT: Некоторые дополнительные исследования и я нашел это: http://illegalargumentexception.blogspot.co.uk/2009/04/i18n-unicode-at-windows-command-prompt.html Оказывается делать с Locale, версии окон и факторов кодирования. Не знаю, как я могу преодолеть это в коде.

+0

'System.out.println ("? Имя_файла £/е> \" е ".replaceAll ("[\\\\/: *? \ "<> |]", "-")); 'работает для меня. –

+0

Каков ваш фактический ввод? –

+0

filename £ /? E> "e –

ответ

3

Я думаю, это зависит от того, как вы на самом деле читаете имя файла с точки зрения кодирования.

Таким образом, символ £ может быть поврежден.

В качестве примера, точно не подходящего для вашего случая, считывание UTF-8-кодированного £ в качестве символа с кодировкой ISO Latin 1 будет возвращать £.

Убедитесь, что кодировка файла (то есть ISO Latin 1 vs UTF-8 будет наиболее распространенной), а затем используйте соответствующий параметр для вашего Reader.

Как сниппета, вы можете рассмотреть этот пример:

BufferedReader br = new BufferedReader(
    new InputStreamReader(
     new FileInputStream(new File("yourTextFile")), 
     "[your file's encoding]" 
    ) 
); 
Смежные вопросы