问题描述
给出以下代码:
<?php
$mb_name = "湊崎 紗夏";
$tmp_mb_name = iconv('UTF-8','UTF-8//IGNORE',$mb_name);
if($tmp_mb_name != $mb_name) {
echo "tmp_mb_name: {$tmp_mb_name}\n";
echo "mb_name: {$mb_name}\n";
exit;
} else {
echo "no problem!\n";
}
我在3v4l.org中进行了测试,并且输出了no problem!
但是,在php:7.4-fpm-alpine docker
图片中,它会输出以下内容:
tmp_mb_name:
mb_name: 湊崎 紗夏
根据php.net:
如果附加字符串// IGNORE,则无法在目标字符集中表示的字符将被静默丢弃。
为什么$mb_name
不能在php高山图像的UTF-8
中表示?
解决方法
添加error_reporting(-1);
,您将看到:
注意:iconv():错误的字符集,第5行的/test.php中不允许从'UTF-8'转换为'UTF-8 // IGNORE'
显然是因为the alpine images just don't work properly with iconv和the maintainers have simply given up on actually fixing it。我认为重要的是要在这里注意,PHP不提供任何任何官方docker镜像,这些是由docker社区维护的PHP的“ Docker官方”镜像。
如果您不介意较大的基础图像,只需切换到非高山图像即可。
编辑:是的,noted workaround确实可以正常工作。为了不在链接后留下有用的信息,请使用示例Dockerfile:
FROM php:7.4-alpine
# fix work iconv library with alpine
RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
示例构建:
docker build -t php:7.4-alpine-iconv ./
,
我遇到了同样的问题。将 php-fpm 图像的提供者从 alpine 更改为 php.net 对我有用。
Dockerfile 示例:
Original:
FROM php:${VERSION}-fpm-alpine
Edited:
FROM php:${VERSION}-fpm
,
如果您使用的是 alpine:3.14
基础映像,则只需安装以下软件包 https://pkgs.alpinelinux.org/packages?name=php7-iconv&branch=v3.14