Расшифруйте имя файла под открытым небом или замените символы Юникода [_x0020_] в String / fileName - PullRequest
0 голосов
/ 08 ноября 2018

Я использую сервис загрузки файлов на свежем воздухе с использованием Java.

Когда я загружаю файл на сервер alfreco, он дает мне следующий путь:

/app:Home/cm:Company_x0020_Home/cm:Abc/cm:TestFile/cm:V4/cm:BC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf

Когда я использую один и тот же путь к файлу и загружаю его с использованием служб Alfresco, я взял имя файла в конце пути

i.e    ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf

Как удалить или декодировать символы [Unicode] в fileName

String decoded = URLDecoder.decode(queryString, "UTF-8");

Выше не работает.

Это некоторые символы Unicode, которые появились в моем имени файла. https://en.wikipedia.org/wiki/List_of_Unicode_characters

Пожалуйста, не отмечайте вопрос как дубликат, поскольку я искал ссылки ниже, но ни одна из них не дала решения. Ниже приведены ссылки, которые я искал для замены символов Юникода в String на Java.

Java удаляет символы Юникода

Удаление не-ASCII символов из строки в Java

Как заменить символ Unicode в строке Java

Java Заменить символы Юникода в строке

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Решение, данное Джеффом Поттсом , будет идеальным.Но у меня была ситуация, когда я использовал имя файла в другом проекте, где я не использовал jar, связанные с org.alfresco

Мне пришлось использовать все эти зависимости для простого декодирования файлов. Поэтому я использовал нативные методы java, которыеиспользует regex для анализа имени файла и его декодирования, что дало мне идеальное решение, которое было таким же, как использование

ISO9075.decode(test);

. Этот код можно использовать

 public String decode_FileName(String fileName) {
        System.out.println("fileName : " + fileName);
        String decodedfileName = fileName;
        String temp = "";
        Matcher m = Pattern.compile("\\_x(.*?)\\_").matcher(decodedfileName); //rejex which matches _x0020_ kind of charectors
        List<String> unicodeChars = new ArrayList<String>();
        while (m.find()) {
            unicodeChars.add(m.group(1));
        }
        for (int i = 0; i < unicodeChars.size(); i++) {
            temp = unicodeChars.get(i);
            if (isInteger(temp)) {
                String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf(temp), 16)));//converting  
                decodedfileName = decodedfileName.replace("_x" + temp + "_", replace_char);
            }
        }
        System.out.println("Decoded FileName :" + decodedfileName);
        return decodedfileName;
    }

И использоватьЭтот небольшой Java-утилита, чтобы знать, является целым числом

public static boolean isInteger(String s) {
        try {
            Integer.parseInt(s);
        } catch (NumberFormatException e) {
            return false;
        } catch (NullPointerException e) {
            return false;
        }
        return true;
    }

Так что приведенный выше код работает так просто:

Пример:

0028 Левая скобка U + 0028 Вы можете увидеть в ссылке https://en.wikipedia.org/wiki/List_of_Unicode_characters

String replace_char = String.valueOf(((char) Integer.parseInt(String.valueOf("0028"), 16)));
        System.out.println(replace_char);

Этот код дает вывод: (, который является левой скобкой

Это та логика, которую я использовал в моейJava-программа.

Приведенная выше программа выдаст результаты, аналогичные ISO9075.decode(test)

Output :

fileName : ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf
Decoded FileName :ABC1X 0400 0109-(1-2)_v2.pdf 
0 голосов
/ 09 ноября 2018

В пакете org.alfresco.util вы найдете класс с именем ISO9075. Вы можете использовать его для кодирования и декодирования строк в соответствии с этой спецификацией. Например:

    String test = "ABC1X_x0020_0400_x0020_0109-_x0028_1-2_x0029__v2.pdf";
    String out = ISO9075.decode(test);
    System.out.println(out);

Возвращает:

    ABC1X 0400 0109-(1-2)_v2.pdf

Если вы хотите увидеть, что он делает за кадром, посмотрите на источник.

...