La funzione PHP strtolower()
deve convertire le stringhe in lettere minuscole. Ma, si dice in the PHP Manual (enfasi aggiunta):Quando è sicuro utilizzare la funzione PHP strtolower()?
Returns stringa con tutti i caratteri alfabetici convertiti in minuscolo.
Nota che 'alfabetico' è determinato dalle impostazioni internazionali correnti. Questo significa che, ad esempio, nella locale predefinita "C", caratteri come umlaut-A (Ä) non verranno convertiti.
Il manuale è in silenzio su codifiche qui, ma è noto che strtolower()
corromperà stringhe UTF-8, dove si suppone di utilizzare mb_strtolower()
invece.
Sto cercando una soluzione nei casi in cui l'estensione mbstring
non è disponibile, e voleva sapere quando è sicuro da usare strtolower()
.
Grazie ai puntatori che mi hanno dato le persone che commentano questa domanda, sembra che la parte rilevante della sorgente PHP sia la chiamata alla funzione tolower()
nella libreria ctype.h
. Il library documentation dice (corsivo):
Se l'argomento di tolower() rappresenta una lettera maiuscola, ed esiste un corrispondente lettera minuscola (come definito dalle informazioni di tipo carattere nel programma categoria di localizzazione LC_CTYPE, il risultato deve essere la corrispondente lettera minuscola .
Secondo le mie prove, in PHP con set_locale(LC_CTYPE, 'C');
personaggi come Ä
(codificato in ISO-8859-1) non vengono toccati. Ma in alcune altre localizzazioni, la funzione restituisce il minuscolo ä
(di nuovo, in ISO-8859-1). In ogni caso, la modifica delle impostazioni internazionali a una che utilizza un set di caratteri UTF-8 non fa fa funzionare PHP strtolower()
sul carattere UTF-8 Ä
.
Considerando la crescente quantità di problemi relativi a I18N e ambienti multilingue, questa informazione può essere di fondamentale importanza. Molte applicazioni si basano su strtolower()
per un semplice controllo senza distinzione tra maiuscole e minuscole. Considerare:
$_POST['username'] = 'Michèlle';
if (strtolower($_POST['username']) == $database['username']) ...
Ora, a seconda della codifica, locali e forse alcune altre variabili, il codice di cui sopra funzionerà in alcuni ambienti, ma non in altri.
La domanda è: Dato che la funzione PHP strtolower()
utilizza la funzione ctype.h
della biblioteca tolower
, che dipende dal "programma di categoria di localizzazione", quando è sicuro di contare su questa funzione? Il comportamento può essere calcolato nei seguenti casi?
- La stringa ASCII
- La stringa è codificato in ISO-8859-1
- La stringa è codificata in qualche altra codifica con la corrispondente serie locale.
(Edit: Domanda riformulato completamente il 26 nov 2013.)
PHP è open source, quindi trovalo nel codice sorgente. –
[Ecco la parte rilevante della fonte] (http://lxr.php.net/xref/PHP_TRUNK/ext/standard/string.c#1397). –
@AmalMurali In realtà, il lavoro viene svolto qui: http://lxr.php.net/xref/PHP_TRUNK/ext/standard/string.c#1376 –