Edit report at https://bugs.php.net/bug.php?id=18556&edit=1
ID: 18556 Comment by: gerd dot katzenbeisser at gmail dot com Reported by: spud at nothingness dot org Summary: Setting locale to 'tr_TR' lowercases class names Status: Assigned Type: Bug Package: Scripting Engine problem Operating System: Linux (RedHat 7.2) PHP Version: 5CVS, 4CVS (2005-10-04) Assigned To: dmitry Block user comment: N Private report: N New Comment: This will probably break a lot of existing PHP Code. Why not performing the lookup case-sensitive and if not found fall back to case-insensitive? And if found case- insensitive throw a deprecation warning. Previous Comments: ------------------------------------------------------------------------ [2011-12-07 18:01:37] cankoy at ymail dot com This, practically, can't be fixed. Mainly because there's no way to know if 'I' is uppercase of 'i' or 'ı' since there's not a separate place for Turkish 'I' in code tables. The same holds for 'i' (can't be known if it's lowercase of 'I' or 'İ'). I told 2 years ago and will say it again: PHP should provide a way to turn off case-insensitive function/class name lookup. No good programmer uses this Basic language feature since identifiers are case-sensitive in all real languages like Python, Ruby, C#, Java. ------------------------------------------------------------------------ [2011-12-03 22:08:24] sg at facelift-bbt dot com This bug was first reported 9 years ago? This definetly got to be fixed. This is a total stopper. I can reproduce it exactly it is shown below. ------------------------------------------------------------------------ [2011-11-06 19:29:44] gerd dot katzenbeisser at gmail dot com here is a simple test case using the internal class PharFileInfo <? $class = 'PharFileInfo'; echo 'Locale: '.setlocale(LC_ALL, '0')."\n"; echo "$class exists? ".var_export(class_exists($class), true)."\n"; echo 'Locale: '.setlocale(LC_ALL, 'tr_TR.UTF-8')."\n"; echo "$class exists? ".var_export(class_exists($class), true); ?> Output: Locale: C PharFileInfo exists? true Locale: tr_TR.UTF-8 PharFileInfo exists? false ------------------------------------------------------------------------ [2011-09-16 14:18:21] robin dot bussiek at googlemail dot com @sweiss-at-stylesight thanks for your explanation. Big +1 for any solution to this topic. ------------------------------------------------------------------------ [2011-09-15 19:59:27] sweiss at stylesight dot com No, the problem results because lowercase i (in most languages) and uppercase I (in most languages) are not actually considered to be the upper/lower variant of the same letter in Turkish. In Turkish, the undotted ı is the lowercase of I, and the dotted İ is the uppercase of i. If you have a class named Image, it will break if the locale is changed to turkish because class_exists() function uses zend_str_tolower(), and changes the case on all classes, because they are supposed to be case insensitive. Someone else above explained it very well: class_exists() function uses zend_str_tolower(). zend_str_tolower() uses zend_tolower(). zend_tolower() uses _tolower_l() on Windows and tolower() on other oses. _tolower_l() is not locale aware. tolower() is LC_CTYPE aware. Please, oh please, can someone fix this already? It has been a very long time and it's extremely annoying and difficult to work around if you have a large multilingual website. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=18556 -- Edit this bug report at https://bugs.php.net/bug.php?id=18556&edit=1