問題描述
docker PHP 的鏡像中贰剥,pathinfo函數(shù)有bug载绿。
basename 和filename毙石,在默認的locale字符集合下椭符,會出現(xiàn)識別字符異常(中文和一些特殊字符無法識別)
例子:
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官網(wǎng)中找到了一種相近的解答 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,輸入如下:
然后直接在容器中執(zhí)行
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=
然后再直接執(zhí)行
php -r "print_r(pathinfo('/1/1/1/我-我.xls'));"
輸出
Array
(
[dirname] => /1/1/1
[basename] => -我.xls
[extension] => xls
[filename] => -我
)
在容器內(nèi)設置locale為en_US.UTF-8后疏尿,再執(zhí)行
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
結果正常。