Как преобразовать строки на любом языке и наборе символов в действительные имена файлов в Java?

Мне нужно сгенерировать имена файлов из имен, введенных пользователем. Эти имена могут быть на любом языке. Например:

  • "John Smith"
  • "高岡和子"
  • "محمد سعيد بن عبد العزيز الفلسطيني"

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

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

В настоящее время я делаю это для англоязычных стран, просто удаляя все не-буквенно-цифровые символы с помощью простого регулярного выражения:

string = string.replaceAll("[^a-zA-Z0-9]", "");
string = string.replaceAll("\\s+", "_")

Некоторые примеры преобразований:

  • "John Smith" -> "John_Smith. ext"
  • "Джон О'Генри" -> "Джон_OHenry.ext"
  • "Джон ван Смит III" -> "Джон_ван_Смит_III.ext"

Очевидно, это не работает на международном уровне.

Я решил найти/сгенерировать черный список всех символов, недопустимых во всех файловых системах, и удалить их из имен. Я не смог найти исчерпывающий список.

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

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

6
задан Josh Crozier 6 December 2013 в 22:06
поделиться