PHP 通过 basename() 输出错误编码的 HTML src


PHP outputs wrongly encoded HTML src through basename()

以下PHP代码在目录中查找文件images/galerias/minerales/brutos/并根据其中的文件夹/图像输出HTML。

<?php
    $folders = glob('images/galerias/minerales/brutos/*', GLOB_ONLYDIR);
    foreach($folders as $folder) {
        echo "<section id='".str_replace(' ', '', (basename($folder)))."' class='gallery'><div id='categoryimg'><p>".basename($folder)."</p></div><!-- SECTION -->".PHP_EOL;
            $files = glob("images/galerias/minerales/brutos/".basename($folder)."/*.{jpg}", GLOB_BRACE);
            foreach($files as $file) {
                echo "<div>".PHP_EOL."    <p>".basename($file, ".jpg")."</p>".PHP_EOL."    <img src='$file' alt='".basename($file, ".jpg")."'>".PHP_EOL."</div>".PHP_EOL;
            }
        echo "</section>";
    }
?>

这在我的本地服务器上完美运行,但在实时服务器上,它输出(以及其他不相关的行)如下内容:

<img src='images/galerias/regalosmagicos/Otros/Atrapasue#U00f1os.jpg' alt='Atrapasue#U00f1os'>

请注意错误编码的"Atrapasueños",它显示为"Atrapasue#U00f1os"。这会导致网站无法渲染文件名中包含特殊字符的图像。考虑到这在我的服务器上运行良好,我想找到一个关于我应该在哪里更改服务器配置的建议,以便让我的 PHP 输出正确编码行。

自己修复了它 - 问题不在于服务器或 PHP 脚本,但我发现每当我上传名称为 Sandía.jpg 的文件时,cPanel 文件管理器都会自动将其更改为 Sand%EDa.jpg 或类似的东西。所以我还有其他一些事情需要排除故障,但至少我知道我的代码从一开始就在工作。

    c
  • 面板版本:cPanel, Inc. 11.52.2.2

  • c面板语言设置为:西班牙语

更新

不仅cPanel文件管理器有问题,Kubuntu的Ark存档管理器也有问题。两者都引入了编码问题。真是一团糟,只要考虑到编码问题可能来自任何地方。

我把这个答案留在这里,因为它可能会帮助那些认为自己遇到服务器端编码问题的人,他们可能也想检查cPanel文件管理器。