将文件传输到Web服务器时转换Unicode分解

Sim*_*mon 9 macos rsync decomposition unicode-normalization web

我正在OS X上进行网站开发,而且我常常发现自己处于将移动网站(运行Linux/LAMP)的某些部分移动到在我自己的机器上运行的开发服务器的情况.一个这样的实例涉及下载图像(用户生成的内容,例如通过ftp下载),以这样或那样的方式处理它们并将它们放回到生产站点上.

涉及的图像文件在Linux机器中创建,其文件名似乎使用NFC分解以UTF-8编码.另一方面,OS X的HFS +文件系统不允许NFC分解的文件名并转换为NFD.但是,一旦我完成并希望上传文件,他们的名字现在将使用NFD分解,因为Linux支持它们.因此,无法在预期的URL访问新上载的(在某些情况下已替换)文件.

我正在寻找一种方法来改变文件的UTF分解(最好)或之后(convmv看起来是一个不错的选择,但我在这个服务器上没有足够的权限,在这种特殊情况下不可能)转移,因为我猜测事先不可能做到这一点.我尝试使用Transmit和rsync进行FTP上传(使用正常使用的部署脚本)无济于事.--iconvrsync中的选项似乎很理想,但不幸的是我运行rsync 2.6.9的服务器无法识别它.

我猜很多人都有类似的问题,我很乐意听到任何解决方案或解决方法!

更新:在这种情况下,我最终将文件rsyncing到运行Ubuntu的虚拟机,在那里运行convmv,然后再次rsyncing到我的登台服务器.虽然这种方法运行得相当好,但有点耗费时间.也许可以在OS X上安装一个ext文件系统,而只是使用原始的NFC分解文件名将文件存储在那里?

另外,为了避免在未来的WordPress安装中出现这些问题,这是我的用例,你可以add_filter('sanitize_file_name', 'remove_accents'); 上传任何文件之前添加一个简单的,你应该没问题.

Env*_*vek 6

目前我正在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/'
Run Code Online (Sandbox Code Playgroud)

将文件从机器复制到服务器

您应该从机器执行此命令:

rsync --iconv=UTF-8-MAC,UTF-8 /Users/username/path/on/machine/ 'username@server.ip.address.here:/home/username/path/on/server/'
Run Code Online (Sandbox Code Playgroud)


Bri*_*ell 5

这似乎rsync --iconv是最好的解决方案,因为您可以一步一步地传输文件并转换名称.您只需说服主机升级其rsync即可.鉴于该--iconv功能是在2008年发布的rsync 3.0.0中引入的,您的主机仍在运行rsync 2.6.9有点奇怪.

如果您无法说服主机安装最新的rsync,您可以编译自己的rsync,将其上传~/bin到服务器上的某个位置,并在系统安装rsync之前将其添加到您的路径中.然后你应该可以使用该--iconv选项.只要您通过SSH(默认)使用rsync而不是rsync守护程序,这应该可以正常工作; 因为SSH上的rsync通过SSH连接到远程计算机,并rsync --server使用您传递给本地rsync的相同选项运行.

或者你可以找到一个拥有最新工具和安装Perl的主机.