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 this is not your bug, you can add a comment by following this link.
If this is your bug, but 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

Add a Patch

Pull Requests

Add a Pull Request

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: Tue Apr 23 13:01:29 2024 UTC