php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #69481 how php initializes locale is not documented
Submitted: 2015-04-19 08:11 UTC Modified: 2021-10-27 12:32 UTC
From: glen at delfi dot ee Assigned:
Status: Open Package: *General Issues
PHP Version: Irrelevant OS:
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: glen at delfi dot ee
New email:
PHP Version: OS:

 

 [2015-04-19 08:11 UTC] 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






Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-10-27 12:32 UTC] cmb@php.net
-Type: Bug +Type: Documentation Problem
 [2021-10-27 12:32 UTC] cmb@php.net
> 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>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 16:01:28 2024 UTC