gli*_*a93 4 php encoding character-encoding iconv docker
给出以下代码:
\n<?php\n$mb_name = "\xe6\xb9\x8a\xe5\xb4\x8e \xe7\xb4\x97\xe5\xa4\x8f";\n$tmp_mb_name = iconv(\'UTF-8\', \'UTF-8//IGNORE\', $mb_name);\nif($tmp_mb_name != $mb_name) {\n echo "tmp_mb_name: {$tmp_mb_name}\\n";\n echo "mb_name: {$mb_name}\\n";\n exit;\n} else {\n echo "no problem!\\n";\n}\nRun Code Online (Sandbox Code Playgroud)\n我在3v4l.org中测试并输出no problem!
然而,在php:7.4-fpm-alpine docker图像中,它输出以下内容:
tmp_mb_name: \nmb_name: \xe6\xb9\x8a\xe5\xb4\x8e \xe7\xb4\x97\xe5\xa4\x8f\n\nRun Code Online (Sandbox Code Playgroud)\n根据php.net:
\n\n\n如果附加字符串 //IGNORE,则无法在目标字符集中表示的字符将被默默丢弃。
\n
为什么无法在 php alpine 图像中$mb_name表示?UTF-8
添加error_reporting(-1);,你会看到:
注意: iconv():错误的字符集,/test.php 第 5 行中不允许从 '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
Run Code Online (Sandbox Code Playgroud)
示例构建:
docker build -t php:7.4-alpine-iconv ./
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4781 次 |
| 最近记录: |