docker php镜像中pathinfo() filename 无法识别中文

问题描述

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 无法识别中文)