Bug->Doc #69481 [Opn]: how php initializes locale is not documented

[email protected]
Newsgroups php.doc.bugs
Message-ID <[email protected]>
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.