diff --git a/ext/standard/string.c b/ext/standard/string.c index c5c6520cf78..5d5f4324f54 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -197,8 +197,18 @@ PHPAPI struct lconv *localeconv_r(struct lconv *out) tsrm_mutex_lock( locale_mutex ); # endif +#if defined(PHP_WIN32) && defined(ZTS) + { + /* Even with the enabled per thread locale, localeconv + won't check any locale change in the master thread. */ + _locale_t cur = _get_current_locale(); + + res = cur->locinfo->lconv; + } +#else /* localeconv doesn't return an error condition */ res = localeconv(); +#endif *out = *res; diff --git a/ext/standard/tests/strings/bug65769.phpt b/ext/standard/tests/strings/bug65769.phpt new file mode 100644 index 00000000000..15dad45bd5e --- /dev/null +++ b/ext/standard/tests/strings/bug65769.phpt @@ -0,0 +1,80 @@ +--TEST-- +Bug #65769 localeconv() broken in TS builds +--SKIPIF-- + +--FILE-- + ++++DONE+++ +--EXPECTF-- +string(19) "Swedish_Sweden.1252" +string(1) "," +string(1) " " +string(3) "SEK" +string(2) "kr" +string(1) "," +string(1) "." +++++++++++++++++++++++ +string(18) "French_France.1252" +string(1) "," +string(1) " " +string(3) "EUR" +string(1) "€" +string(1) "," +string(1) " " +++++++++++++++++++++++ +string(26) "English_United States.1252" +string(1) "." +string(1) "," +string(3) "USD" +string(1) "$" +string(1) "." +string(1) "," +++++++++++++++++++++++ +string(2) "ru" +string(1) "," +string(1) " " +string(3) "RUB" +string(1) "?" +string(1) "," +string(1) " " +++++++++++++++++++++++ +string(25) "Czech_Czech Republic.1250" +string(1) "," +string(1) " " +string(3) "CZK" +string(2) "Kč" +string(1) "," +string(1) " " +++++++++++++++++++++++ +string(19) "Serbian_Serbia.1250" +string(1) "," +string(1) "." +string(3) "RSD" +string(4) "din." +string(1) "," +string(1) "." +++++++++++++++++++++++ ++++DONE+++