的PHP strtolower()
功能應該將字符串轉換爲小寫。但是,它說in the PHP Manual(強調):什麼時候可以安全使用PHP strtolower()函數?
返回串與轉換爲小寫所有字母。
請注意'字母'由當前語言環境決定。這意味着 ,在即默認的「C」區域,字符,如變音符-A(A) 將不被轉換。
該手冊是沉默的編碼這裏,但已知strtolower()
將損壞UTF-8字符串,在這裏你都應該使用mb_strtolower()
代替。
我正在尋找一個解決方案,其中mbstring
擴展不可用,並且想知道何時可以安全使用strtolower()
。
感謝評論此問題的人給我的指示,似乎PHP源的相關部分似乎是調用ctype.h
函數庫中的tolower()
函數。所述library documentation說(強調):
如果 參數的tolower的()表示一個大寫字母,且存在 一個對應的小寫字母(如由字符類型信息在 程序語言環境類別LC_CTYPE定義),結果應爲相應的 小寫字母。
根據我的測試,在PHP與set_locale(LC_CTYPE, 'C');
字符,如Ä
(在ISO-8859-1編碼)是保持不變。但在其他一些語言環境中,該函數返回小寫字母ä
(再次,在ISO-8859-1中)。總之,改變區域設置一個使用UTF-8字符集不做出的UTF-8字符Ä
PHP strtolower()
工作。
考慮到國際化相關的問題和語言環境的越來越多,這些信息可能是非常重要的。許多應用程序依賴strtolower()
進行簡單的不區分大小寫的檢查。試想一下:
$_POST['username'] = 'Michèlle';
if (strtolower($_POST['username']) == $database['username']) ...
現在,根據編碼,語言環境,也許一些其他變量,上面的代碼會在某些環境中工作,而不是在別人。
現在的問題是:鑑於PHP strtolower()
函數使用ctype.h
庫的tolower
函數,它依賴於「程序語言環境類別」,何時可以安全地指望此函數?在下列情況下,這種行爲能夠被計算在內嗎?
- 該字符串是ASCII
- 該字符串在ISO-8859-1
- 編碼的字符串在一些其它編碼與相應區域集編碼。
(編輯:問題26完全改寫2013年十一月)
PHP是開源的,所以在源代碼中找到它。 –
[這是相關部分的源代碼](http://lxr.php.net/xref/PHP_TRUNK/ext/standard/string.c#1397)。 –
@AmalMurali其實,這裏的工作是在這裏完成的:http://lxr.php.net/xref/PHP_TRUNK/ext/standard/string.c#1376 –