2014-09-01 8 views
7

Ho questo codice:Come posso usare strlen in php per persiano?

$string = 'علی'; 
echo strlen($string); 

Dal $string ha caratteri persiani, uscita deve essere ma ottengo .

علی ha 3 caratteri. Perché la mia uscita è ?

Come posso utilizzare strlen() in PHP per Persiano con output reale?

+3

Utilizzare ['mb_strlen()'] (http://php.net/mb-strlen) (dall'estensione MBString). – BlitZ

+2

L'output è 6 perché 'strlen()' conta i byte senza considerare la codifica. Nella tua codifica (probabilmente UTF8) ogni personaggio conta come 2 byte. Quindi, l'output per 3 caratteri sarà = 6 ('3 caratteri * 2 byte '). – BlitZ

+1

Ho eseguito 'var_dump (mb_strlen ('علی'));' me stesso, ma l'output è ancora 6? – bhargavg

risposta

5

provare questo:

function ustrlen($text) 
{ 
    if(function_exists('mb_strlen')) 
     return mb_strlen($text , 'utf-8'); 
    return count(preg_split('//u', $text)) - 2; 
} 

che funzionerà per qualsiasi versione di PHP.

5

mb_strlen funzione è tuo amico

13

Usa mb_strlen

Restituisce il numero di caratteri nella stringa str codifica dei caratteri avere (il secondo parametro) codifica. Un carattere multi-byte viene contato come 1.

Dal momento che i 3 personaggi sono tutti multi-byte, si ottiene 6 tornò con strlen, ma questo torna 3 come previsto.

echo mb_strlen($string,'utf-8'); 

Fiddle

Nota

E 'importante non sottovalutare la potenza di questo metodo e alternative simili. Ad esempio si potrebbe essere inclini a dire ok se i caratteri sono multi-byte quindi ottenere la lunghezza con strlen e dividerlo per 2 ma funzionerà solo se tutti i caratteri della stringa sono multi-byte e anche un periodo . invaliderà il conteggio. Ad esempio questo

echo mb_strlen('علی.','utf-8'); 

Restituisce 4 che è corretto. Quindi questa funzione non solo prende l'intera lunghezza e la divide per 2, conta 1 per ogni carattere multi-byte e 1 per ogni carattere a byte singolo.

Nota 2:

Sembra che avete deciso di non utilizzare questo metodo perché mbstring estensione non è abilitato per impostazione predefinita per le vecchie versioni di PHP e si potrebbe avere deciso di non provare le consente :) Per i lettori futuri però , non è difficile ed è consigliabile abilitarlo se si hanno a che fare con caratteri multi-byte in quanto non solo la lunghezza che potrebbe essere necessario gestire. See Manual

+0

Questo emetterà ancora '3', è necessario passare il parametro' encoding' come @Rox menzionato – bhargavg

+0

Questo è corretto, corretto. –

+1

** '+ 1' ** pieno di informazioni;) – dashtinejad

4
$string = 'علی'; 
echo mb_strlen($string, 'utf8'); 
0

Come di PHP5, iconv_strlen() possono essere utilizzati (come descritto in php.net, restituisce il numero di caratteri di una stringa, quindi probabilmente è la scelta migliore):

iconv_strlen("علی"); 
// 3 

Sulla base di this answer da Chernyshevsky @ hotmail.com, si può provare questo:

function string_length (string $string) : int { 
    return strlen(utf8_decode($string)); 
} 

string_length("علی"); 
// 3 

Inoltre, come hanno risposto gli altri, è possibile utilizzare mb_strlen():

mb_strlen("علی"); 
// 3 
  • C'è una piccola differenza tra di loro (per i caratteri latini illegali):

    iconv_strlen("a\xCC\r"); // A notice 
    string_length("a\xCC\r"); // 3 
    mb_strlen("a\xCC\r"); // 2 
    
  • Performance: mb_strlen() è il più veloce. In totale, non vi è alcuna differenza tra iconv_strlen() e string_length() alle prestazioni. Ma incredibilmente, mb_strlen() è più veloce che sia circa 9 volte (come ho provato)!

Nota: Aggiungere 'echo' ad ogni dichiarazione di uscita di loro! ;)

Problemi correlati