Domanda

In questi ultimi giorni ho lavorato verso la conversione di mia base di codice PHP da latin1 a UTF-8. Ho letto le due soluzioni principali sono di sostituire le funzioni a singolo byte con il costruito nel funzioni multibyte, o impostare il valore mbstring.func_overload nel file php.ini.

Ma poi mi sono imbattuto in questa discussione su stack overflow, dove il post di thomasrutter sembra per indicare che le funzioni multibyte non sono realmente necessari per UTF-8, fintanto che i letterali script e stringhe sono codificate in UTF-8.

Non ho trovato altre prove se questo è vero o no, e se si scopre che non c'è bisogno di convertire il mio codice per le mb_functions allora che sarebbe stato un risparmiatore in tempo reale! Chiunque in grado di far luce su questo?

È stato utile?

Soluzione

Per quanto ho capito il problema, a patto che tutti i vostri dati sono al 100% in utf-8 - e questo significa l'input dell'utente, del database, e anche la codifica del PHP file stessi se si dispone di caratteri speciali in loro - questo è true vero per operazioni di ricerca e di confronto . Come @ntd sottolinea, uno strlen non multibyte () produrrà risultati errati quando viene eseguito su una stringa che contiene i caratteri multibyte.

THis è un grande articolo sulle basi di codifica.

Altri suggerimenti

Non sono "necessarie" a meno che non si sta utilizzando uno qualsiasi dei funzioni che vanno a sostituire (ed è probabile che si sono utilizzando almeno uno di questi) o in altro modo esplicito bisogno di una funzione dell'estensione come HTTP gestione .

Quando si lavora verso UTF-8 rispetto, ho sempre ripiegare alla PHP UTF-8 Cheatsheet con un'aggiunta: modelli PCRE ha bisogno di essere aggiornato per utilizzare il modificatore u

.

Non appena si sta esaminando o la modifica di 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

thomasrutter indica che il ricerca non ha bisogno di un trattamento speciale. Per esempio, se avete bisogno di controllare la lunghezza di una stringa UTF8, non vedo come si può farlo usando strlen() pianura.

funzioni come mb_strtoupper può essere necessario, anche. strtoupper non convertirà A ad A.

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 e, eventualmente, utilizzare le funzioni di sostituzione. C'è un elenco abbastanza completo all'indirizzo: http://www.phpwact.org/php/ i18n / utf-8

Si potrebbe utilizzare la libreria mbfunctions che estende le funzioni multibyte in PHP:

http://code.google.com/p/mbfunctions/

È possibile utilizzare questa http://php.net/manual/en/mbstring.overload.php Un'impostazione nel file php.ini, quindi non c'è bisogno di cambiare il vostro codice.

Ma attenzione, perché non tutte le funzioni stringa verrà modificata automaticamente. Questo è uno: http://php.net/manual/en/function. substr-replace.php

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top