Edit report at https://bugs.php.net/bug.php?id=69481&edit=1
ID: 69481
Updated by: [email protected]
Reported by: glen at delfi dot ee
Summary: how php initializes locale is not documented
Status: Open
-Type: Bug
+Type: Documentation Problem
Package: *General Issues
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
> the fact that there even is setlocale(LC_CTYPE, "") done
> unconditionally in php init, […]
This is fortunately no longer the case as of PHP 8.0.0[1].
[1] <https://github.com/php/php-src/commit/c4ad8beaa890b931031a5cf8a1d2d38550fca3af>
Previous Comments:
------------------------------------------------------------------------
[2015-04-19 08:11:52] glen at delfi dot ee
Description:
------------
seems php initializes ONLY LC_CTYPE from enviroment, leaving default behaviour that declaring LC_ALL value overrides any other category BROKEN:
this seems to be related to some experiment done in 2000 and then reverted:
https://github.com/php/php-src/commit/7e0baa7a1daa531e39881e59842c88d12e42c901
the fact that there even is setlocale(LC_CTYPE, "") done unconditionally in php init, is not documented.
but i think it should be either:
1. no unconditional setlocale() call at all
2. setlocale(LC_ALL, "");
3. setlocale(LC_ALL, "C");
the last one is probably the worst.
Test script:
---------------
compare how system date command behaves and how php behaves:
test1: only LC_ALL env var is set, but php resets LC_CTYPE, meaning LC_CTYPE gets env value, the other categories get reset to C:
$ env -i LC_ALL=et_EE.utf8 php -r 'var_dump(setlocale(LC_ALL, 0)); passthru("set -x;env;date +%A%d.%B"); echo "\nPHP:", strftime("%A, %d. %B"), "\n";'
string(169) "LC_CTYPE=et_EE.utf8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C"
+ env
_=/usr/bin/env
LC_ALL=et_EE.utf8
PATH=/usr/bin:/bin
+ date +%A%d.%B
pühapäev19.aprill
PHP:Sunday, 19. April
test2: if php would do setlocale(LC_ALL, "") instead of setlocale(LC_CTYPE, ""), then result is as expeted, LC_ALL overrides all categories. shell and php behaviour matches:
$ env -i LC_ALL=et_EE.utf8 php -r 'setlocale(LC_ALL, ""); var_dump(setlocale(LC_ALL, 0)); passthru("set -x;env;date +%A%d.%B"); echo "\nPHP:", strftime("%A, %d. %B"), "\n";'
string(10) "et_EE.utf8"
+ env
_=/usr/bin/env
LC_ALL=et_EE.utf8
PATH=/usr/bin:/bin
+ date +%A%d.%B
pühapäev19.aprill
PHP:pühapäev, 19. aprill
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=69481&edit=1
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.