V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
RobertYang
V2EX  ›  PHP

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

  •  
  •   RobertYang · 2019-05-19 10:21:59 +08:00 · 3743 次点击
    这是一个创建于 2026 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    9 条回复    2022-06-08 10:12:19 +08:00
    haiyang416
        1
    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
        2
    RobertYang  
    OP
       2019-05-19 11:12:35 +08:00
    @haiyang416 已发现如果 setlocale(LC_NUMERIC,' ')时会直接无法显示中文 basename,setlocale(LC_ALL,' ')时显示正常。难道是跟服务器上其他 PHP 程序有关系,如果当前程序没有设置 setlocale 时会被其他程序的设置影响?
    haiyang416
        3
    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
        4
    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
        5
    RobertYang  
    OP
       2019-05-19 12:39:40 +08:00 via Android
    @haiyang416 最奇葩的是不设置也显示,但是状态随机
    whoisix
        6
    whoisix  
       2020-04-28 16:24:11 +08:00
    我今天也遇到了,测试上面是正常的,生产和本机有问题,查到可以通过 setlocale 修正,本机测试 ok,生产还没有添加相关代码,跑测试的代码发现又正常了。现在一头雾水不知道是哪里影响到了
    RobertYang
        7
    RobertYang  
    OP
       2020-05-08 13:44:30 +08:00 via Android
    @whoisix 确实要设置下 setlocale 而且不能全局,不添加的话是随机错误
    grey5659
        8
    grey5659  
       2021-04-02 11:46:20 +08:00
    我也遇到了,时有时无,真是坑死人
    GeorgeGalway
        9
    GeorgeGalway  
       2022-06-08 10:12:19 +08:00
    今天我也遇到了相同的问题,应该是个 Bug ,测试和本机都正常,生产环境复现,php 版本 7.2 。
    后来把文件名改成英文开头解决了,也算是曲线修复 BUG ,奇奇怪怪。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3488 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:18 · PVG 19:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.