2014-03-26 65 views
7

我使用jqueryFileTree显示服务器上的目录列表,其中包含目录中文件的下载链接。 最近我碰到的一个问题,与包含特殊字符的文件:PHP scandir()和htmlentities():字符集和/或特殊字符问题

  • 检验.pdf:正常工作
  • 检验.pdf:不工作(注意é - 锐音符 - 在文件名)

当调试jqueryFileTree的PHP连接器,我看到它的操作的方式从$ _GET通过目录的SCANDIR(),然后在目录中的每个文件/目录循环。 在将文件名解析为url之前,脚本似乎在文件名上正确执行了htmlentities()。 问题似乎是这个htmlentities($ file)调用只是返回一个空字符串,根据php docs,当输入字符串在给定编码中包含无效的代码单元时,可能会出现这种情况。但我试图通过调用隐式传递字符集:

$file = htmlentities($file,ENT_QUOTES,'UTF-8'); 

但是,这也返回一个空字符串。

如果我打电话: $ file = htmlentities($ file,ENT_IGNORE,'UTF-8'); 急性字符刚甩掉E(因此成为检验.pdf tst.pdf)

调试时我用Xdebug的PHP脚本,我可以看到源字符串包含未知字符(看起来像this)。

所以我非常想知道这个解决方案。 任何帮助将受到欢迎。

FYI:

  • 我的网页的字符集是UTF-8(在元数据中指定)
  • 该文件存储在Windows 2003文件服务器和SCANDIR()与UNC路径执行(如//文件服务器/共享名/ sourcedir)
  • 在我的php.ini的默认编码设置为UTF-8
  • 的Web服务器& PHP 5.4.26的是Windows上运行2008 R2服务器

回答

12

我最好的猜测是文件名本身并没有使用UTF-8。或者至少scandir()没有像这样挑选它。

也许mb_detect_encoding()能说明一些吗?

var_dump(mb_detect_encoding($filename)); 

如果没有,尝试猜测编码(CP1252或ISO-8859-1将是我的第一个猜测),并将其转换为UTF-8,看是否输出有效:

var_dump(mb_convert_encoding($filename, 'UTF-8', 'Windows-1252')); 
var_dump(mb_convert_encoding($filename, 'UTF-8', 'ISO-8859-1')); 
var_dump(mb_convert_encoding($filename, 'UTF-8', 'ISO-8859-15')); 

或者用iconv()

var_dump(iconv('WINDOWS-1252', 'UTF-8', $filename)); 
var_dump(iconv('ISO-8859-1', 'UTF-8', $filename)); 
var_dump(iconv('ISO-8859-15', 'UTF-8', $filename)); 

然后,当你已经想通了其编码实际使用,你的代码应该看起来有点像这样(假设CP1252):

$filename = htmlentities(mb_convert_encoding($filename, 'UTF-8', 'Windows-1252'), ENT_QUOTES, 'UTF-8'); 
+0

谢谢队友!我试图iconv(),但只尝试'WINDOWS-1251',而不是1252变种,去图:-)我能修复我的脚本感谢这个答案,享受赏金:) – Alex

+0

请添加逗号在“mb_convert_encoding($ filename,'UTF-8',...”)之后,我会提示一个编辑,但我必须添加其他字符才能验证它(因为编辑至少应该是6个字符) –

+0

@MarcoPanichi谢谢指出! –