2011-10-28 3 views
5

Attualmente sto cercando di rimuovere tutti i caratteri speciali e gli accenti da una stringa UTF-8 trasformandoli, se possibile, nel loro carattere ASCII equivalente.Perché iconv di PHP ha bisogno di setlocale?

Così sto semplicemente usando questo codice:

$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

Il problema è che, per esempio la parola "debutto" si trasforma in "dbut" invece di "debutto". Per farlo funzionare, ho bisogno di aggiungere una chiamata a setlocale, in questo modo:

setlocale(LC_ALL, 'en_US.UTF8'); 
$result = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $input); 

E io non capisco perché. Pensavo che l'UTF-8 e l'ASCII fossero sempre gli stessi, qualunque sia la localizzazione che usi.

EDIT: Non intendevo UTF-8 è uguale a ASCII, volevo dire UTF-8 è uguale a sempre UTF-8 e ASCII è sempre uguale ASCII

+0

ASCII e UTF-8 non sono uguali. UTF-8 è più grande di ordini di grandezza. – NikiC

risposta

1

Il sottoinsieme di UTF-8 che si sovrappone con ASCII (che è il codice punti 0-127) è in effetti identico a ASCII. Tuttavia, i caratteri latini accentati non fanno parte del set di caratteri ASCII e se non lo fai tu stesso, le impostazioni locali predefinite del sistema (che evidentemente non contengono questi caratteri accentati) vengono utilizzate per ottenere un set di caratteri con cui lavorare.

In generale, iconv può essere un po 'incerto; questo è menzionato nel introduction dell'estensione:

Questo modulo contiene un'interfaccia iconv conversione set di caratteri . Con questo modulo, è possibile trasformare una stringa rappresentata da un set di caratteri locali in uno rappresentato da un altro set di caratteri, che potrebbe essere il set di caratteri Unicode. I set di caratteri supportati dipendono dall'implementazione iconv del sistema. Si noti che la funzione iconv in alcuni sistemi potrebbe non funzionare come previsto. In tal caso, sarebbe una buona idea installare la libreria libiconv di GNU. Sarà probabilmente finire con risultati più coerenti.