美文网首页
docker php镜像中pathinfo() filename

docker php镜像中pathinfo() filename

作者: lensuntop | 来源:发表于2021-12-24 14:56 被阅读0次

    问题描述

    docker PHP 的镜像中,pathinfo函数有bug。
    basename 和filename,在默认的locale字符集合下,会出现识别字符异常(中文和一些特殊字符无法识别)
    例子:

    var_dump(pathinfo('中国人2016.xls'));
    

    输出:

    array(4) { 
    'dirname' => string(1) "." 
    'basename' => string(8) "2016.xls" 
    'extension' => string(3) "xls" 
    'filename' => string(4) "2016" 
    }
    

    先揭晓解决方案

    在构建docker镜像的时候,直接指定locale字符集为en_US.UTF-8即可。

    排查思路

    在php官网中找到了一种相近的解答 https://www.php.net/manual/zh/function.pathinfo.php

    setlocale(LC_ALL, 'zh_CN.UTF-8');
    var_dump(pathinfo('中国人2016.xls'));
    
    array(4) { 
    'dirname' => string(1) "." 
    'basename' => string(17) "中国人2016.xls" 
    'extension' => string(3) "xls" 
    'filename' => string(13) "中国人2016" 
    }
    

    但是在代码中直接加上这个是不行的,然后我在docker php5.6.40的容器中直接输出locale,输入如下:
    然后直接在容器中执行

    LANG=
    LANGUAGE=
    LC_CTYPE="POSIX"
    LC_NUMERIC="POSIX"
    LC_TIME="POSIX"
    LC_COLLATE="POSIX"
    LC_MONETARY="POSIX"
    LC_MESSAGES="POSIX"
    LC_PAPER="POSIX"
    LC_NAME="POSIX"
    LC_ADDRESS="POSIX"
    LC_TELEPHONE="POSIX"
    LC_MEASUREMENT="POSIX"
    LC_IDENTIFICATION="POSIX"
    LC_ALL=
    

    然后再直接执行

    php -r "print_r(pathinfo('/1/1/1/我-我.xls'));"
    

    输出

    Array
    (
        [dirname] => /1/1/1
        [basename] => -我.xls
        [extension] => xls
        [filename] => -我
    )
    

    在容器内设置locale为en_US.UTF-8后,再执行

    Array
    (
        [dirname] => /1/1/1
        [basename] => 我-我.xls
        [extension] => xls
        [filename] => 我-我
    )
    

    结果正常。但是在http请求中还是不行。
    在构建镜像中添加上

    RUN apt-get -y install locales \
    && sed -ie 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen \
    && locale-gen en_US.UTF-8 
    
    ENV LANG en_US.UTF-8 
    

    结果正常。

    相关文章

      网友评论

          本文标题:docker php镜像中pathinfo() filename

          本文链接:https://www.haomeiwen.com/subject/wfryjltx.html