На нашей CMS, которая прошла через множество версий и платформ хостинга, мы только что натолкнулись на файл изображения с акцентом, который не работал с его URL-адресом. Итак, я подключился к коробке по ssh и попытался переименовать ее.
Однако я не мог понять, как правильно набрать его имя. Например, я знаю, что если файл называется my file.txt
ты бы сделал что-то вроде mv my\ file.txt my_new_file.txt
но как переместить файл с именем café.txt
?
В конце концов, я использовал подстановочный знак и сделал mv caf*.txt cafe.txt
но мне все еще интересно, почему это изображение с акцентом не будет работать в первую очередь, и что было бы правильным способом справиться с ним в unix.
Используя bash:
Просто чтобы посмотреть мои файлы:
$ ls
café.txt
Проверьте шестнадцатеричные байты имени файла (примечание: у меня может быть другое ... у меня, вероятно, в кодировке UTF-8):
$ echo * | hexdump -C
00000000 63 61 66 c3 a9 2e 74 78 74 0a |caf...txt.|
0000000a
Затем создайте имя файла, используя шестнадцатеричные коды для частей, которых нет на вашей клавиатуре:
$ ls $'caf\xc3\xa9.txt'
café.txt
В bash $ '...' будет расширять escape-последовательности (так же, как "echo -e"). И \ x, за которым следует двухзначный шестнадцатеричный код, заменит его этим символом.
И я не вижу ничего плохого в:
ls caf*.txt
за которым следует
mv caf*.txt cafe.txt
Но если по какой-то причине это соответствует нескольким файлам, вы можете использовать шестнадцатеричный код:
ls $'caf\xc3\xa9.txt'
mv $'caf\xc3\xa9.txt' café.txt
Файловые системы Unix хранят имена файлов в виде необработанной последовательности байтов. Ядро не знает или не заботится о том, каковы на самом деле имена.
Приложения, обращающиеся к ним, должны использовать правильную кодировку для правильного отображения символов, отличных от ASCII. Обычный способ - через переменные среды LC_ALL / LC_ * или LANG. Я бы рекомендовал использовать локаль UTF-8 для всех приложений, обращающихся к файловой системе, чтобы избежать несовместимости / несогласованности.