2009-11-16 14 views
5

In questi ultimi giorni ho lavorato per convertire il mio codice PHP da latin1 a UTF-8. Ho letto le due soluzioni principali: sostituire le funzioni a byte singolo con le funzioni multibyte integrate o impostare il valore mbstring.func_overload nel file php.ini.Uso del set di caratteri UTF-8 con PHP - sono richieste le funzioni mb?

Ma poi mi sono imbattuto in this thread su stack overflow, dove il post di thomasrutter sembra indicare che le funzioni multibyte non sono in realtà necessari per UTF-8, fino a quando i valori letterali stringa di script e sono codificati in UTF- 8.

Non ho trovato altre prove che questo sia vero o no, e se risulta che non ho bisogno di convertire il mio codice in mb_functions, allora sarebbe un risparmio in tempo reale! Qualcuno in grado di far luce su questo?

risposta

10

Per quanto ne so, purché tutti i dati siano al 100% in utf-8 - e ciò significa input dell'utente, database e anche la codifica dei file PHP stessi se si dispone di caratteri speciali in essi - Questo è true true per le operazioni di ricerca e confronto. Come sottolinea @ntd, uno strlen() non multibyte produrrà risultati errati quando viene eseguito su una stringa che contiene caratteri multibyte.

THis è un grande articolo sulle basi della codifica.

+0

Grazie a tutti quelli che hanno risposto, ora capisco. Molto apprezzato! – Spoonface

2

thomasrutter indica che la ricerca non richiede una gestione speciale. Ad esempio, se è necessario verificare la lunghezza di una stringa UTF8, non vedo come si possa farlo usando il semplice strlen().

4

non sono "necessarie" a meno che non si sta utilizzando una qualsiasi delle functions they replace (ed è probabile che si sono utilizzando almeno uno di questi) o in altro modo esplicito bisogno di una caratteristica del prolungamento, come HTTP handling.

Quando si lavora in conformità con UTF-8, ricado sempre allo PHP UTF-8 Cheatsheet con un'aggiunta: i motivi PCRE devono essere aggiornati per utilizzare il modificatore u.

3

Non appena si esamina o si modifica una stringa multibyte, è necessario utilizzare una funzione mb_ *. Un rapido esempio che dimostra il motivo per cui:

$str = "abcžđščćöçefg"; 
mb_internal_encoding("UTF-8"); 

echo "strlen: ".strlen($str)."\n"; 
echo "mb_strlen: ".mb_strlen($str)."\n"; 

Questo stampa:

strlen: 20 
mb_strlen: 13 
1

Ci sono una serie di funzioni che prevedono stringhe di essere singolo byte (Ed alcuni anche presumere che si tratta di iso-8859 -1). In questi casi, è necessario essere consapevoli di ciò che si sta facendo ed eventualmente utilizzare le funzioni di sostituzione. C'è un elenco abbastanza completo a: http://www.phpwact.org/php/i18n/utf-8

2

Anche funzioni come mb_strtoupper possono essere necessarie. strtoupper non convertirà á in Á.