Преобразование декомпозиции Unicode при передаче файлов на веб-сервер

Я занимаюсь разработкой веб-сайта на OS X, и довольно часто я оказываюсь в ситуациях, когда я перемещаю некоторую часть живого веб-сайта (под управлением Linux/LAMP) на сервер разработки, работающий на моей собственной машине. Один из таких случаев включает в себя загрузку изображений (пользовательский контент, например, через ftp-загрузку), обработку их так или иначе и их возврат на производственный сайт.

файлы изображений, созданные на компьютере Linux, по-видимому, имеют свои имена файлов, закодированные в UTF-8 с использованием декомпозиции NFC. С другой стороны, файловая система OS X HFS+ не позволяет NFC разлагать имена файлов и преобразовывать их в NFD. Однако, как только я закончу и хочу загрузить файлы, их имена теперь будут использовать декомпозиции NFD, так как Linux поддерживает их обоих. В результате вновь загруженные (а в некоторых случаях и замененные) файлы не будут доступны по ожидаемому URL-адресу.

Я ищу способ изменить декомпозицию UTF файлов во время (желательно) или после (convmv выглядит как хороший вариант, но у меня нет достаточно прав на этом сервере это невозможно в данном конкретном случае) передача, так как я предполагаю, что это невозможно сделать заранее. Я пробовал FTP-загрузку с помощью Transmit и rsync (используя сценарий развертывания, обычно используемый) безрезультатно. the --iconv опция в rsync казалась идеальной, но, к сожалению, мой сервер под управлением rsync 2.6.9 не распознал ее.

Я думаю, довольно много людей возникли подобные вопросы, я буду рад услышать любое решение или обходной путь!

обновление: в этом случае я закончил rsyncing файлов на виртуальную машину под управлением Ubuntu, запуск convmv на них там, а затем rsyncing снова на мой промежуточный сервер. Хотя это работает довольно хорошо, это немного времени. Возможно, можно было бы смонтировать файловую систему ext на OS X и просто хранить файлы там, используя их исходный разложенный файл NFC имена?

кроме того, чтобы избежать этих проблем все вместе на будущих установках WordPress, что было моим вариантом использования, вы можете добавить простой add_filter('sanitize_file_name', 'remove_accents'); до загрузка любых файлов, и вы должны быть в порядке.

2 ответов


кажется,rsync --iconv является лучшим решением, так как вы можете передавать файлы и перекодировать имена все в один шаг. Вам просто нужно убедить ваш хост обновить их rsync. Учитывая, что --iconv функция была введена в rsync 3.0.0, который был выпущен в 2008 году, это немного странно, что ваш хост по-прежнему работает rsync 2.6.9.

если вы не можете убедить своего хоста установить последнюю версию rsync, вы можете скомпилировать свой собственный rsync, загрузить его где-то вроде ~/bin на сервер и добавьте его в свой путь до того, как система установит rsync. Тогда вы должны иметь возможность использовать . Это должно работать до тех пор, пока вы используете rsync через SSH (по умолчанию), а не демон rsync; потому что rsync через SSH работает путем SSHing на удаленную машину и работает rsync --server С теми же параметрами, которые вы передали локальному rsync.

или вы можете найти Хост, на котором установлены современные инструменты и Perl.


В настоящее время я использую rsync --iconv такой:

учитывая сервер Linux и OS X машина:

копирование файлов с сервера на машину

вы должны выполнить эту команду С сервера (он не будет работать с OS X):

rsync --iconv=UTF-8,UTF-8-MAC /home/username/path/on/server/ 'username@your.ip.address.here:/Users/username/path/on/machine/'

копирование файлов с компьютера на сервер

вы должны выполнить эту команду из машины:

rsync --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'