2013-04-05 11 views

risposta

19

strlen() non gestisce correttamente i caratteri multibyte, poiché presuppone che 1 carattere sia uguale a 1 byte, che è semplicemente non valido per Unicode. Questo comportamento è documentato qui: http://php.net/strlen

strlen() restituisce il numero di byte piuttosto che il numero di caratteri in una stringa.

soluzione è quella di utilizzare mb_strlen() funzione invece (mb sta per multi byte) (see mb_strlen() docs).

EDIT

Se per qualsiasi ragione il cambiamento nel codice non è possibile/fattibile, uno potrebbe voler garantire le funzioni di stringa vengono automaticamente sovraccarico da controparti multi-byte. Questo è supportato da PHP e documented here.

Si prega di notare che si potrebbe anche voler modificare il proprio php.ini per assicurarsi che mb_string funzioni come si desidera. Le impostazioni disponibili sono documented here.

+0

Mi chiedo, qual è il punto specifico per separare le funzioni unicode/non-unicode? Perché non sempre usi le funzioni '(mb_)'? –

+1

A breve: è perché il design PHP (come lingua) risucchia in molti punti e questo include anche il supporto UTF8. PHP non supportava codifiche multibyte internamente per anni, ed è per questo che è stata creata l'estensione multibyte. Puoi usare 'mb_' automaticamente da PHP usando l'overloading delle funzioni -> vedi http://php.net/manual/en/mbstring.overload.php ma questo dipende dalla configurazione di PHP, quindi a volte potrebbe essere meglio usare direttamente' mb_ 'Se non puoi assicurarti che sarà usato in altro modo. –

+0

Grazie per le spiegazioni, amico mio, e soprattutto per indicare "sovraccarico", ho perso tutto questo ... Saluti! –

0

La funzione strlnen non conta il numero di caratteri, ma il numero di byte. Per i caratteri multibyte restituirà numeri più alti.
Utilizzare mb_strlen() per contare il numero effettivo di caratteri.

0

Proprio come un addendum alle altre risposte che fanno riferimento mb_strlen():

Se l'impostazione mbstring.func_overload ha bit 2 set a 1, quindi strlen conterà caratteri in base al set di caratteri di default php.in; altrimenti conterrà il numero di byte nella stringa