我们有一个运行 CentOS 5.8 的 Web 服务器,它使用 SVN 进行版本控制。当尝试切换到最新版本时,我们收到有关上传目录中文件的文件名的错误:
svn: Error converting entry in directory 'adm/emails/upload' to UTF-8
svn: Valid UTF-8 data
(hex: 54 79)
followed by invalid UTF-8 sequence
(hex: f6 6b 69 72)
经过调查,我们注意到有些文件的文件名损坏了:
$ ls ~/public_html/adm/emails/upload/
Ty?el?m?trendit.csv
Ty?kirja1.csv
为了快速完成更新,我们只需mv
将文件添加到主目录中即可。令人惊讶的是,它们的文件名在新位置看起来不错:
$ ls ~/
Työelämätrendit.csv
Työkirja1.csv
更新后,我们将它们移回原来的位置,但它们的文件名又被破坏了。这是什么原因造成的?我们该如何修复?系统的语言环境设置为LANG=en_US.UTF-8
。
答案1
x54 x79 是 ASCII 中的“Ty”,这是有效的 ISO-8859-1 和 UTF-8,但 xF6 x6B x69 x72 是“ökir”,这是 ISO-8859-1 编码,不是有效的 UTF-8。它被双向翻译,这有点令人毛骨悚然,但又很精彩。这引出了一个问题:文件系统是否参与其中。
大多数 Unix 文件系统对字符集非常敏感 - 它们只处理字节。如果有两个文件系统(其中一个可能不是 ext3),您可以检查这两个文件系统的具体安装方式,并深入了解通过 ~/public_html/adm/email/upload/ 的路径是否通过 NFS 或类似的东西,这可能会在底层文件系统字符集上分层另一个文件系统字符集 - Samba 在那里会非常有趣,因为它有明确的字符集选项。
当然,检查 LC_CTYPE 是否设置奇怪也是一个好主意:
$ touch Työelämätrendit.csv
$ ls T*
Työelämätrendit.csv
$ LC_CTYPE=C ls T*
Ty??el??m??trendit.csv
$
也许 SVN 进程中没有设置 LC_CTYPE?当它由 Web 服务器、批处理作业等间接运行时,这种情况很容易发生。