【问题标题】:PHP scandir() and htmlentities(): issues with charset and/or special charactersPHP scandir() 和 htmlentities():字符集和/或特殊字符的问题
【发布时间】:2017-04-26 22:05:57
【问题描述】:

我正在使用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 服务器上运行

【问题讨论】:

    标签: php utf-8 character-encoding


    【解决方案1】:

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

    【讨论】:

    • 谢谢伙计!我尝试了 iconv() 但只尝试了 'WINDOWS-1251' 而不是 1252 变体,请看图 :-) 由于这个答案,我能够修复我的脚本,享受赏金:)
    • 请在 "mb_convert_encoding( $filename, 'UTF-8', ..." 之后添加逗号,否则会出错。我建议进行编辑,但我必须添加其他字符才能验证它(因为编辑至少应该是 6 个字符)
    • 不要为我工作,请检查:stackoverflow.com/questions/45119920/…
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2012-07-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多