为什么iconv在php:7.4-fpm-alpine docker中返回空字符串

问题描述

给出以下代码:

<?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 iconvthe 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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...