PHP scandir() 和 htmlentities() : issues with charset and/or special characters

标签 php utf-8 character-encoding

我正在使用 jqueryFileTree显示服务器上的目录列表以及目录中文件的下载链接。 最近我遇到了包含特殊字符的文件的问题:

  • test.pdf:工作正常
  • tést.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 锐音符刚刚被删除(所以 tést.pdf 变成 tst.pdf)

当使用 xdebug 调试我的 php 脚本时,我可以看到源字符串包含一个未知字符(看起来像 this)。

所以我很想在这里找到解决方案。 欢迎任何帮助。

仅供引用:

  • 我页面的字符集是 UTF-8(在元数据中指定)
  • 文件存储在 windows 2003 文件服务器上,scandir() 使用 UNC 路径执行(例如//fileserver/sharename/sourcedir)
  • 我的 php.ini 中的默认编码设置为 UTF-8
  • 网络服务器和 PHP 5.4.26 在 windows 2008 R2 服务器上运行

最佳答案

我最好的猜测是文件名本身没有使用 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');

关于PHP scandir() 和 htmlentities() : issues with charset and/or special characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22660797/

相关文章:

php - 如何从某些 URL 获取 HTTP header (位置)?

php - 如何使用 PHP 将阿拉伯语文本从 HTML 表单正确地存储到 MySQL 数据库中?

php - 从数据库表打印文本的字符集问题

sql - 国际化 - 支持所有语言的字符集?

visual-studio - Visual Studio 2013 产生乱码/损坏/错误编码的 html

php - Laravel: 类 App\Posts 不存在

php - 在 Cakephp 中,如何在同一查询中从不同数据库获取数据?

PHP 5 中的 PHP 匿名函数

python - 大写不适用于特殊字符 - Python

php - 从一个数据库读取数据并使用 PHP 插入另一个数据库时出现编码错误