问题描述
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
结果正常。