将PHP应用程序从Windows Server 2003迁移到Linux时遇到的文件名编码问题

我有几个实际运行在Windows 2003 Server上的PHP应用程序。 因为他们实际上在Windows上使用PHP,Mysql甚至是Apache,所以这个项目将把他们转移到一个新的Linux服务器上(基于Debian)。

但是当用'特殊字符'(非ASCII文件,如éèàç)用于文件名(这是法文中的常规)时,我遇到了用户上传文件的问题。

例如文件“accuséréception.pdf”存储如下:

$ ls accus? r?ception.pdf 

当我在Linux服务器上传一个新文件的时候,似乎没有问题:文件将被命名为类似于fs的文件,但应用程序可以find它。 问题是内容已迁移,文件可用,但应用程序无法find它!

我想知道问题来自哪里:

  • 文件系统的字符表/编码表,我认为它来自这里
  • 应用程序本身的PHP代码,这将是一个问题,因为我不能改变它。 我可以提交错误请求,但是我不确定什么时候会修复。
  • 另一个问题

而最重要的是我需要find一种方法来解决这个问题。 因为它只发生在迁移的数据上,所以在Linux服务器上生产这些应用程序时,我可以编写一个脚本或调整我的fs / php / whatever来解决这个问题。

在此先感谢您的帮助。

注意:当应用程序找不到文件时,我的Apache日志被填充'readdir()期望参数1是资源,布尔在…错误中给出

Windows通常使用unicode来编码非ASCII字符,所以如果你在你的debian服务器上使用unicode-locale,你就设置好了。 它不一定是法语只是因为你想使用的字符是法国的专业(只是testing这个,我有我的LANG设置为en_US.UTF-8,我可以用你提到的名称创build一个文件“accuséréception.pdf”),它也是如此。

机会是在那里,他们只是无法显示。 为了testing这个理论,用“LANG = en_US.UTF8 ls”replace那个“ls”命令。 如果它显示正确,它只是你的terminal。 只需在shell的启动文件(例如.bashrc)或系统范围的/ etc / default / locale中设置LANGvariables

我终于find了一些有关我的问题的信息,以及解决方法。 开发这些php应用程序的公司告诉我使用iso-8859-1来存储文件,以这种方式configurationApache。 这并没有解决我的问题,但给了我一个想法。

我使用convmv http://www.j3e.de/linux/convmv/man/ (感谢如何知道在Linux上的文件名的语言编码? )转换文件名从utf-8(复制到debian使他们utf -8我认为)以ISO-8859-1与

 $ convmv -f utf-8 -t iso-8859-1 --no-test -r * 

它解决了我的问题,因为我的应用程序现在可以find存储的文件(已迁移和新build的文件)。

唯一的问题是在我的shell中,我仍然看不到正确的文件名:

 $ ls test   .xls $ LANG=fr_FR.UTF-8 ls test ??.xls 

但这是一个“小问题”。

ps:抱歉没有正确揭露问题的原始问题,以及如此晚的答案