В Java пути представлены с использованием типа String в стандартной библиотеке, которая внутри использует UCS-2. Это не зависит от реализации, поскольку некоторые методы String так или иначе «утекают» из этой кодировки.
Как Java удается представлять произвольные пути последовательности байтов Unix как Unicode? Я предполагаю, что он рассматривает пути как ASCII или UTF-8, чтобы сопоставить «необработанные» байты с кодовыми точками Unicode, поскольку на практике пути почти всегда представляют собой ASCII или UTF-8, но что, если есть недопустимая последовательность байтов? ASCII или UTF-8? Является ли преобразование в Unicode/UCS-2 без потерь? Существует ли документированный алгоритм движения вперед и назад? Что мне следует учитывать при работе с путями к файлам в Java, если я не хочу исключать пользователей, не использующих латинский алфавит?
Пример
- Перейдите в пустой каталог
- Введите touch $(echo -e "\xc3\x28"). Это создаст совершенно правильный файл с именем, которое не может быть представлено в Юникоде.
- Откройте jshell
- Введите новый файл(" .".listFiles()[0].isFile()
Это возвращает false - Если вы посмотрите на путь к указанному файлу, он содержит код U+FFFD, за которым следует \x28, что означает, что \xC3 был преобразован с потерями в Unicode и не представляет фактический путь. больше
Подробнее здесь: https://stackoverflow.com/questions/783 ... to-unicode