默认的 PHP 语言环境来自哪里?

时间:2021-04-27 09:20:28

标签: php bash debian

我在 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

0 个答案:

没有答案