【问题标题】:How to open this file?如何打开这个文件?
【发布时间】:2013-07-15 05:19:28
【问题描述】:

不幸的是,我允许用户将文件上传到服务器而无需先清理其名称(Linux、PHP、MySQL)。

其中一个上传的文件名为“E_M_20-06-2013_14-15_ComidasTípicas.zip”(在 MySQL 数据库中是正确的,UTF-8 编码)。

但是当我尝试在 PHP 中执行 fopen() 时,我找不到这个文件。根据语言环境 (LANG),我检索不同的文件名,例如:

    $ export LANG=pt_BR.UTF-8
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT*
    ../web/downloads/E_M_20-06-2013_14-15_ComidasTípicas.zip

    $ export LANG=pt_BR.ISO-8859-1
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT*
    ../web/downloads/E_M_20-06-2013_14-15_ComidasT▒?­picas.zip

    $ export LANG=C                             
    $ ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT*
    ../web/downloads/E_M_20-06-2013_14-15_ComidasT????picas.zip

有人可以帮助我了解如何使用 PHP 打开此文件吗?

PS:当然,我试过utf8_encode、utf8_decode,都没有成功。

提前致谢!

【问题讨论】:

  • 你的 PHP 文件是什么编码的?你怎么fopen()文件,文件名从哪里来的?

标签: php linux filenames non-ascii-characters


【解决方案1】:

编写一个脚本来查找文件并重命名文件,而不会出现损坏的字符(非字母数字和下划线)

检查scandir以查找文件http://php.net/manual/en/function.scandir.php

检查此线程以查找非字母数字字符PHP Regular expression - Remove all non-alphanumeric characters

因此,您将获得干净的文件名,并在您的数据库中写入。如果需要,您也可以对数据库字段执行相同的操作。

【讨论】:

  • 如果底层文件系统支持 UTF-8,即使是 PHP 脚本,文件名也可以正常工作而无需清理。它只需要正确地完成。
  • 我有用 PHP 编写的清理文件名例程;我可以将它应用于存储在数据库和文件系统中的文件名。但我不明白为什么 rename($old_filename, $new_filename) 失败说它找不到带有重音字符的文件($old_filename)。顺便说一句,我使用的是 Debian Linux,EXT4 文件系统。
  • 而且几乎不可能手工完成。在这种情况下有数千个文件(感谢上帝,它的数量不再增长)!
【解决方案2】:

请尝试使用:

$ export LANG=en_US.UTF-8

在php中的意思:

setlocale(LC_ALL, 'en_US.UTF8');

【讨论】:

  • 同样奇怪的事情:# export LANG=en_US.UTF-8 # ls ../web/downloads/E_M_20-06-2013_14-15_ComidasT* ../web/downloads/E_M_20-06-2013_14 -15_ComidasTípicas.zip
  • 尝试输入locale -a 以获取已安装语言环境的列表。如果 en_US.UTF-8 丢失,你应该先安装它。
猜你喜欢
  • 2022-10-05
  • 2015-12-20
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
相关资源
最近更新 更多