我在 GNU/Linux (Debian 10 Buster) 服务器上偶然发现了 PHP-CLI v7.3 中的语言环境陷阱。
php -v
PHP 7.3.27-1~deb10u1 (cli) (built: Feb 13 2021 16:31:40) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.27, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.27-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies
所有浮点数和/或双数都用十进制逗号回显。但是我希望它像我期望的那样用十进制点打印 - 尽管我的 Bash 设置为 de_DE.UTF-8
。
陷阱示例
<?php
$f = 4.2;
echo $f, PHP_EOL;
var_dump($f);
陷阱输出
php float.php
4,2
float(4,2)
解决方案 1
在覆盖环境 LC_NUMERIC
设置为 C
变量的情况下运行脚本。
LC_NUMERIC=C php float.php
4.2
float(4.2)
解决方案 2
在代码中设置预期的语言环境(输出与解决方案 1 相同)。
<?php
setlocale(LC_NUMERIC, 'C');
$f = 4.2;
echo $f, PHP_EOL;
var_dump($f);
我的问题是: 为什么 PHP 的语言环境设置为 de_DE.UTF-8
以及它来自哪里?
我看过的地方
grep -Prin '^[^;#]*(locale|lc|lang|intl)' /etc/default/ /etc/environment* /etc/php/
/etc/default/locale:2:LANG="en_US.UTF-8"
/etc/php/7.0/phpdbg/php.ini:963:[intl]
/etc/php/7.3/fpm/php.ini.ucf-dist:1002:[intl]
/etc/php/7.3/fpm/php.ini:1002:[intl]
/etc/php/7.3/cli/php.ini:1002:[intl]
/etc/php/7.3/mods-available/intl.ini:3:extension=intl.so
/etc/php/7.3/phpdbg/php.ini:1002:[intl]
php -i | grep intl.default_locale
intl.default_locale => no value => no value
<?php
echo locale_get_default(); # => en_US
echo setlocale(LC_NUMERIC, 0); # => de_DE.UTF-8