[Docker][PHP] NumberFormatter::formatCurrency 7.4.29 和 7.4.28 之间不兼容

[Docker][PHP] NumberFormatter::formatCurrency incompatible between 7.4.29 and 7.4.28

(与 https://github.com/docker-library/php/issues/1301 相同)

运行 以下脚本的结果在 php:7.4.29-fpm-alpinephp:7.4.28-fpm-alpine 之间不同。

<?php

$fmt = new \NumberFormatter('JA_JP', \NumberFormatter::CURRENCY);
$formatString = $fmt->formatCurrency(0, 'JPY');

var_dump($formatString);

结果

(我的)问题

有什么方法可以使 php:7.4.29-fpm-alpine 中的结果与 php:7.4.28-fpm-alpine 中的结果相同吗? (有解决方法吗?)

复制方式

参见 https://github.com/sogaoh/reproduce-incompatibility-of-format-currency (README.md)

备注

(未确认)我猜

之间也有类似的问题

两者的区别在于.28版本使用\uffe5'全角日元符号,.29版本使用\u00a5'日元符号

如 github 问题评论中所述,这可能是图像构建之间底层 ICU 库的变化,而不是图像、Alpine 或 PHP 本身的问题.作为临时修复,您可以使用修改后的图像来安装 ICU 的固定版本,但 YMMV。

或者,您可以使用简单的替代方法填充,例如:

str_replace("\xc2\xa5", "\xef\xbf\xa5", $formatter_output);

尽管这个问题本身很表面化,而且 IMO 最初使用全角字形作为货币符号是更值得怀疑的选择。

我的解决方案:

另外安装 package: icu-data-full

参考资料