猿问

为什么 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 alpine 图像中的 UTF-8 中表示?


江户川乱折腾
浏览 151回答 4
4回答

德玛西亚99

添加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 alpineRUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconvENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php示例构建:docker build -t php:7.4-alpine-iconv ./

蝴蝶刀刀

PHP5.6.40和Alpine3.8相当古老的帖子,其中包含答案,但由于没有答案涵盖旧版本的PHP和alpine linux,我将发布我如何修复它。< /span>1/ 从 下载 php 扩展 .so 文件(因为下一个版本中不存在该扩展,并且某些旧版本(例如 alpine3.x)不存在该扩展。 8)alpine3.13docker 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你不应该再有这个错误了。

FFIVE

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

撒科打诨

最后我用PHP8解决了这个问题在尝试了很多不同的方法之后docker pull php:8.0.14-cli-alpine3.15docker run -dit --name myphp php:8.0.14-cli-alpine3.15docker 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 nanoapk add --no-cache --repository https://dl-3.alpinelinux.org/alpine/edge/testing/ gnu-libiconv-devmv /usr/bin/gnu-iconv /usr/bin/iconvmv /usr/include/gnu-libiconv/*.h /usr/includerm -fr /usr/include/gnu-libiconvmkdir -p /tmp/qcd /tmp/qwget https://secure.php.net/distributions/php-8.0.14.tar.gztar xzf php-8.0.14.tar.gzcd php-8.0.14/ext/iconvphpize./configure --with-iconv=/usr错误configure: error: iconv does not support errno尝试解决它:nano configure现在删除“else”块(包含iconv does not support errno错误消息)继续./configure --with-iconv=/usrmakemake installmkdir -p /etc/php8/conf.decho "extension=iconv.so" > /etc/php8/conf.d/iconv.iniapk del .bcdrm -fr /tmp/q测试php -m | grep iconvphp -i | grep iconvphp -r 'echo iconv("UTF-8","UTF-8//IGNORE","A\xe9 B"),PHP_EOL;'
随时随地看视频慕课网APP
我要回答