为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
江户川乱折腾 2023-12-15 15:38:57
给出以下代码:<?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 中表示?
查看完整描述

4 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

添加error_reporting(-1);,您将看到:

注意: iconv():错误的字符集,从“UTF-8”转换而来到“UTF-8//忽略” /test.php 第 5 行不允许

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

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

示例 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 ./


查看完整回答
反对 回复 2023-12-15
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

PHP5.6.40和Alpine3.8

相当古老的帖子,其中包含答案,但由于没有答案涵盖旧版本的PHPalpine linux,我将发布我如何修复它。< /span>

1/ 从 下载 php 扩展 .so 文件(因为下一个版本中不存在该扩展,并且某些旧版本(例如 alpine3.x)不存在该扩展。 8)alpine3.13

docker run -v $(pwd)/out:/out -it alpine:3.13 \\n/bin/sh -c 'apk add --no-cache gnu-libiconv && cp -f /usr/lib/preloadable_libiconv.so /out/preloadable_libiconv.so'

您应该在本地 /out/ 目录中找到*.so 文件。

2/ 将文件添加到您的图像Dockerfile并使用 php 预加载

COPY your/file/previously/downloaded/path/preloadable_libiconv.so /usr/lib/preloadable_libiconv.so
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php

你不应该再有这个错误了。



查看完整回答
反对 回复 2023-12-15
?
FFIVE

TA贡献1797条经验 获得超6个赞

如果您使用的是alpine:3.14基础映像,则只需安装以下软件包https://pkgs.alpinelinux.org/packages?name =php7-iconv&branch=v3.14


查看完整回答
反对 回复 2023-12-15
?
撒科打诨

TA贡献1934条经验 获得超2个赞

最后我用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;'


查看完整回答
反对 回复 2023-12-15
  • 4 回答
  • 0 关注
  • 150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信