繁体   English   中英

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

[英]Why does iconv returns empty string in 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 alpine 图像中不能用UTF-8表示?

添加error_reporting(-1); 你会看到:

注意: iconv(): 错误的字符集,第 5 行的 /test.php 中不允许从 'UTF-8' 转换为 'UTF-8//IGNORE'

因为显然alpine 图像不能与 iconv 一起正常工作,并且维护者只是放弃了实际修复它 我认为在这里需要注意的是,PHP 不提供任何官方的 docker 镜像,这些是由 docker 社区维护的 PHP 的“Docker 官方”镜像。

如果您不介意更大一些的基本图像,只需切换到非高山图像即可。

编辑:是的,上述解决方法似乎确实有效。 为了不在链接后面留下有用的信息,例如 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

通过按该顺序安装php7-mbstring php7-iconv修复

RUN apk --no-cache add php7-mbstring php7-iconv

原始解决方案在这里: https : //github.com/docker-library/php/issues/240#issuecomment-355489551

最后我用 PHP8 解决了

在尝试了很多不同的方法之后

docker pull php:8.0.14-cli-alpine3.15

docker run -dit --name myphp php:8.0.14-cli-alpine3.15

docker exec -it --user root myphp ash

现在我们在容器中:

apk add --no-cache --virtual .b $PHPIZE_DEPS curl-dev openssl-dev pcre-dev pcre2-dev zlib-dev wget build-base php8-dev nano

apk add --no-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/ gnu-libiconv-dev

mv /usr/bin/gnu-iconv /usr/bin/iconv

mv /usr/include/gnu-libiconv/*.h /usr/include

rm -fr /usr/include/gnu-libiconv

mkdir -p /tmp/q

cd /tmp/q

wget https://secure.php.net/distributions/php-8.0.14.tar.gz

tar xzf php-8.0.14.tar.gz

cd php-8.0.14/ext/iconv

phpize

./configure --with-iconv=/usr

错误

configure: error: iconv does not support errno

尝试解决它:

nano configure

现在删除“else”块(包含iconv does not support errno错误消息)

继续

./configure --with-iconv=/usr

make

make install

mkdir -p /etc/php8/conf.d

echo "extension=iconv.so" > /etc/php8/conf.d/iconv.ini

apk del .b

cd

rm -fr /tmp/q

测试

php -m | grep iconv

php -i | grep iconv

php -r 'echo iconv("UTF-8","UTF-8//IGNORE","A\xe9 B"),PHP_EOL;'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM