PHP 中文文件夹或文件名 basename 时有时无的问题

2019-05-19 10:21:59 +08:00
 RobertYang

系统 Centos 与 Ubuntu,PHP7.2 与 7.3 均出现过。获取中文文件夹的 basename 有时会出现为空的情况,页面再次获取又是正常的。 之前有看到中文 UTF-8 处理可能依赖于 PHP-intl 模块,但是安装卸载后好像影响不大。

刚刚我重启 PHP-fpm 之后无论怎么刷新 basename 都输出正常,之前也是运行一段时间过后又会出现相同的情况。

3766 次点击
所在节点    PHP
9 条回复
haiyang416
2019-05-19 11:06:02 +08:00
100 万次测试没有重现。

PHP 7.2.17-0ubuntu0.18.04.1 (cli) (built: Apr 18 2019 14:12:38) ( NTS )
RobertYang
2019-05-19 11:12:35 +08:00
@haiyang416 已发现如果 setlocale(LC_NUMERIC,' ')时会直接无法显示中文 basename,setlocale(LC_ALL,' ')时显示正常。难道是跟服务器上其他 PHP 程序有关系,如果当前程序没有设置 setlocale 时会被其他程序的设置影响?
haiyang416
2019-05-19 12:05:05 +08:00
@RobertYang 搜索了一下,貌似 basename 的行为受 locale 的影响,后面有空了去翻下 basename 的 c 代码看看。

https://stackoverflow.com/questions/45268499/php-basename-and-pathinfo-with-multibytes-utf-8-file-names/45268539
haiyang416
2019-05-19 12:06:02 +08:00
https://www.php.net/manual/en/function.basename.php
官方文档也提到了:
Caution
basename() is locale aware, so for it to see the correct basename with multibyte character paths, the matching locale must be set using the setlocale() function.
RobertYang
2019-05-19 12:39:40 +08:00
@haiyang416 最奇葩的是不设置也显示,但是状态随机
whoisix
2020-04-28 16:24:11 +08:00
我今天也遇到了,测试上面是正常的,生产和本机有问题,查到可以通过 setlocale 修正,本机测试 ok,生产还没有添加相关代码,跑测试的代码发现又正常了。现在一头雾水不知道是哪里影响到了
RobertYang
2020-05-08 13:44:30 +08:00
@whoisix 确实要设置下 setlocale 而且不能全局,不添加的话是随机错误
grey5659
2021-04-02 11:46:20 +08:00
我也遇到了,时有时无,真是坑死人
GeorgeGalway
2022-06-08 10:12:19 +08:00
今天我也遇到了相同的问题,应该是个 Bug ,测试和本机都正常,生产环境复现,php 版本 7.2 。
后来把文件名改成英文开头解决了,也算是曲线修复 BUG ,奇奇怪怪。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/565484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX