关键:不管是什么系统,php 语言中的目录分隔符一律用 /
windows10系统,PHP版本为 7.4 ,当路径中含有中文,且使用 反斜杠 \ 作为目录分隔符时,pathinfo 返回的 [dirname] 中文信息可能被丢弃
在 linux 系统,php版本为 8.2 ,却不存在这样的问题,
使用 / 作为 目录分隔符时,windows10 和 linux 返回值都是正确。
以下是例子
echo setlocale(LC_ALL, 0); # 返回的 LC_CTYPE=Chinese (Simplified)_China.936 ,是支持 中文的 $path = 'D:\temp\项目\测试\ceshia07.webp'; print_r(pathinfo($path)); 返回 [dirname] => D:\temp ,而不是 D:\temp\项目\测试 $path = 'D:\temp\项目\测试\walk\ceshia07.webp'; print_r(pathinfo($path)); 返回 D:\temp\项目\测试\walk
php.net 档案 https://www.php.net/manual/zh/function.pathinfo.php 中有这样的警号
警告
pathinfo() 是本地化的,所以为了让它能正确地解析一个包含多字节编码的路径, 必须使用 setlocale() 函数来设置地区信息。
这一警告的目的是指: 当pathinfo() 的 $path 中包含非本地的多字节编码路径时,要使用 setlocale() ,而本地的多字节编码则无需使用 setlocale()
更准确的理解为,pathinfo() 要解析 多字节路径,系统中需要安装了 对应 的多字节语言,否则,即使 setlocale() 指定了多字节编码, pathinfo()也是不能解析的
关于 setlocale() ,php.net的档案
https://www.php.net/manual/zh/function.setlocale.php
语法 zh_CN.UTF8 。 UTF8 不带 ('-') , locale.codeset 而不是 locale-codeset.
小技巧
在 Windows 中,setlocale(LC_ALL, '') 空值使用系统的默认区域/语言设置(即通过控制面板设置的信息)。
Windows 用户可以在 Microsoft 的 MSDN 网站上找到有关 locales 字符串的有用信息。支持的语言字符串可在» 语言字符串文档中找到,支持的国家/区域字符串可在» 国家/区域文档中找到。
语言字符串文档 http://msdn.microsoft.com/en-us/library/39cwe7zf.aspx
国家/区域文档 http://msdn.microsoft.com/en-us/library/cdax410z.aspx
浙公网安备 33010602011771号