Edit report at https://bugs.php.net/bug.php?id=65230&edit=1
ID: 65230 Updated by: a...@php.net Reported by: xrstf-misc at yahoo dot com Summary: setting locale randomly broken -Status: Analyzed +Status: Wont fix Type: Bug Package: *General Issues Operating System: Windows 7 x64 PHP Version: 5.5.0 Block user comment: N Private report: N New Comment: And after all, locale has such issues on any platform. The solution is to use intl or custom localization functionality. Previous Comments: ------------------------------------------------------------------------ [2013-07-30 15:54:08] a...@php.net This isnt 5.5 issue only, you can find it in any PHP version starting with 5.3. localeconv() isnt thread safe and using it with _configthreadlocale() might lead to unpredictable results. That's why bug #63688 was marked "won't fix" - a solution, if any, might be very tricky. ------------------------------------------------------------------------ [2013-07-09 22:45:26] xrstf-misc at yahoo dot com Description: ------------ I am experiencing trouble setting the locale (with setlocale(LC_ALL, ...)) in my code. With PHP 5.4, it always worked as expected, with 5.5 it appears that the locale has been changed, but localeconv() is still returning old values and functions like printf('%f') do not behave as expected. I have disabled the new Opcache, but the random behaviour persisted. I can't tell when it happens and why it sometimes doesn't work. It seems (to me) that there is some kind of threading problem, as I can have the same code in different browser tabs and get different results. I am using PHP 5.5.0 VC11 TS x86 on Windows 7 x64, loaded as a module into my Apache 2.4.3, which is running as a service. Test script: --------------- <?php function test($locale, $value) { $newlocale = setlocale(LC_ALL, $locale); $conv = localeconv(); $sep = $conv['decimal_point']; printf("%s\n--------------------------\n", $newlocale); printf(" sep: %s\n", $sep); printf(" %%f: %f\n", $value); printf(" %%F: %F\n", $value); printf("date: %s\n", strftime('%x')); printf("\n"); } test('german', 3.41); test('english', 3.41); test('french', 3.41); test('german', 3.41); Expected result: ---------------- German_Germany.1252 -------------------------- sep: , %f: 3,410000 %F: 3.410000 date: 10.07.2013 English_United States.1252 -------------------------- sep: . %f: 3.410000 %F: 3.410000 date: 7/10/2013 French_France.1252 -------------------------- sep: , %f: 3,410000 %F: 3.410000 date: 10/07/2013 German_Germany.1252 -------------------------- sep: , %f: 3,410000 %F: 3.410000 date: 10.07.2013 Actual result: -------------- German_Germany.1252 -------------------------- sep: . %f: 3.410000 %F: 3.410000 date: 10.07.2013 English_United States.1252 -------------------------- sep: . %f: 3.410000 %F: 3.410000 date: 7/10/2013 French_France.1252 -------------------------- sep: . %f: 3.410000 %F: 3.410000 date: 10/07/2013 German_Germany.1252 -------------------------- sep: . %f: 3.410000 %F: 3.410000 date: 10.07.2013 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=65230&edit=1