Domanda

Oggi ho riscontrato un problema con la funzione php strpos() perché ha restituito FALSE anche se il risultato corretto era ovviamente 0. Questo perché un parametro è stato codificato in UTF-8, ma l'altro (origine è un HTTP GET parametro) ovviamente no.

Ora ho notato che l'uso della funzione mb_strpos ha risolto il mio problema.

La mia domanda ora è: è saggio usare le funzioni della stringa multibyte PHP in generale per evitare questi problemi in futuro? Devo evitare le tradizionali funzioni strpos, strlen, ereg, ecc. Ecc.?

Nota: non voglio impostare mbstring.func_overload globale in php.ini, perché questo porta ad altri problemi quando si usa la libreria PEAR. Sto usando PHP4.

È stato utile?

Soluzione

Dipende dalla codifica dei caratteri che stai utilizzando. Nelle codifiche di caratteri a byte singolo o UTF-8 (in cui un singolo byte all'interno di un carattere non può mai essere confuso con un altro carattere), fintanto che la stringa che stai cercando e la stringa che stai usando per cercare sono nella stessa codifica quindi puoi continuare a utilizzare le normali funzioni di ricerca di stringhe.

Se si utilizza una codifica multi-byte diversa da UTF-8, che non impedisce ai singoli byte all'interno di un carattere di apparire come altri caratteri, non è mai sicuro eseguire una ricerca di stringhe utilizzando le normali funzioni di ricerca di stringhe. Potresti trovare falsi positivi. Questo perché il confronto delle stringhe di PHP in funzioni come strpos è per byte, e con l'eccezione di UTF-8 che è specificamente progettato per prevenire questo problema, le codifiche multi-byte subiscono il problema che qualsiasi byte successivo in un carattere costituito da più di un byte può corrispondere a parte di un carattere diverso.

Se la stringa che stai cercando in e la stringa che stai cercando hanno codifiche di caratteri diverse, la conversione sarà sempre necessaria. Altrimenti troverai che per ogni stringa che sarebbe rappresentata diversamente nell'altra codifica, restituirà sempre falso. Dovresti effettuare tale conversione in input: decidi su un carattere che verrà codificato dalla tua app e sarà coerente all'interno dell'applicazione. Ogni volta che ricevi input con una codifica diversa, esegui la conversione durante il passaggio.

Altri suggerimenti

Ci sono stati alcuni problemi con le funzioni mb_ * nelle versioni di PHP precedenti alla 5.2. Quindi, se il tuo codice funziona su più piattaforme con diverse versioni di PHP, possono verificarsi comportamenti strani. Inoltre, la funzione mb_ strpos è piuttosto lenta, deve saltare il numero di caratteri specificato dal parametro offset per ottenere la posizione reale del byte utilizzata internamente. Nei loop a seconda della funzionalità strpos / mb_strpos questo può diventare un grosso collo di bottiglia.

Se usi la stessa codifica ovunque, generalmente non è un problema. Uso UTF-8 per tutte le mie pagine e non ho mai riscontrato questo problema. Alla fine si riduce davvero a specificare la stessa codifica per le pagine e il database.

Ad esempio:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

Nella maggior parte dei casi ciò significa che tutte le origini dati per l'applicazione forniranno i dati nella stessa codifica, evitando così questo tipo di problemi.

Questo sarà tutto molto meglio con l'avvento PHP 6, tra l'altro, poiché includerà il supporto completo per Unicode.

Non devi necessariamente usare mb_strpos, ma devi assicurarti che tutti i dati nella tua app siano gli stessi: o mb_string o una semplice stringa in una particolare codifica. (Di solito UTF-8.)

Se ti assicuri che le tue pagine siano UTF-8 e che i tuoi invii di moduli siano interpretati come UTF-8 e che il tuo database memorizzi UTF-8, generalmente starai bene. Le operazioni di stringa indicizzate (in particolare troncamenti) possono interrompere una sequenza UTF-8, che è fastidiosa ma generalmente non disastrosa. Se hai bisogno di quel livello di supporto, mb_strings è la tua unica opzione (ma ovviamente devi assicurarti che tutte le parti della tua app e delle librerie e la versione di PHP possano affrontarle correttamente).

Lo sviluppo di siti che gestiscono correttamente Unicode in PHP non è molto divertente in questo momento: il suo supporto Unicode è molto scarso rispetto a linguaggi come Python e .NET. Si spera che PHP6 migliorerà le cose.

Consiglierei di usare la seguente libreria PHP UTF-8:

http://sourceforge.net/projects/phputf8

Il raggruppamento con l'applicazione allenta i requisiti dell'applicazione non richiedendo l'estensione mbstring, ma ottieni comunque le funzioni stringa UTF-8.

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