You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP如何读取含变音字符的目录文件?(PHP7.2+Azure App Service)

解决Azure App Service下PHP7.2读取含变音字符文件名的问题

这个问题我之前在Azure的PHP环境里踩过坑,核心就是字符编码不匹配——PHP默认的文件系统编码和Azure宿主环境的编码没对齐,才会把Köln.pdf这类带变音字符的文件名搞成K"ln.pdf。下面分两种情况给你具体的解决方案:

先确认你的Azure宿主系统

首先去Azure门户的「应用服务」->「配置」->「常规设置」里看你的应用是跑在Linux还是Windows上,两种环境的处理方式不一样。

情况1:Linux-based Azure App Service

Linux容器的文件系统默认是UTF-8编码,问题通常出在PHP的内部编码或区域设置没跟上。你可以在代码开头加上这两行:

mb_internal_encoding('UTF-8');
setlocale(LC_COLLATE, 'en_US.UTF-8');

然后再调用scandir,返回的文件名就会是正确的UTF-8格式:

$targetDir = '/home/site/wwwroot/your-directory';
$files = scandir($targetDir);
// 此时$files里的"Köln.pdf"就能正常显示了

情况2:Windows-based Azure App Service

Windows宿主的文件系统编码是Windows-1252(也就是CP1252),而PHP默认可能用UTF-8处理字符串,所以需要把scandir返回的文件名从Windows-1252转成UTF-8:

$targetDir = 'D:\home\site\wwwroot\your-directory';
$rawFiles = scandir($targetDir);
// 批量转换编码
$utf8Files = array_map(function($filename) {
    return mb_convert_encoding($filename, 'UTF-8', 'Windows-1252');
}, $rawFiles);
// 现在$utf8Files里的文件名就是正确的"Köln.pdf"

备选方案:用DirectoryIterator替代scandir

如果上面的方法还是有问题,试试PHP的DirectoryIterator类,它对文件系统编码的处理更稳定:

$dir = new DirectoryIterator('/home/site/wwwroot/your-directory'); // Linux路径
// Windows路径用'D:\home\site\wwwroot\your-directory'
$files = [];
foreach ($dir as $fileInfo) {
    if (!$fileInfo->isDot()) {
        $filename = $fileInfo->getFilename();
        // Windows环境下记得加编码转换
        // $filename = mb_convert_encoding($filename, 'UTF-8', 'Windows-1252');
        $files[] = $filename;
    }
}

额外提示:全局设置编码

如果不想在每个文件里写编码设置,可以在Azure里自定义PHP配置:

  1. 在你的应用根目录(wwwroot)下创建一个php.ini文件,添加:
mb_internal_encoding = UTF-8
  1. 去Azure门户的「应用服务」->「配置」->「应用设置」里,添加一个新的设置:
    • 名称:PHP_INI_SCAN_DIR
    • 值:/home/site/wwwroot(Linux)或D:\home\site\wwwroot(Windows)
      这样PHP启动时会自动加载这个自定义的ini文件,全局生效。

内容的提问来源于stack exchange,提问作者Prawin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:17:59