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

时间:2012-09-28 15:58:45

标签: macos web rsync decomposition unicode-normalization

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

目前我正在使用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/'