2014-09-01 22 views
7

Ich habe diesen Code:Wie kann ich Strlen in PHP für Persisch verwenden?

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

Seit $string Persian Zeichen hat, Ausgang sein muss, aber ich bekomme .

علی hat 3 Zeichen. Warum ist meine Ausgabe ?

Wie kann ich strlen() in PHP für Persisch mit realer Ausgabe verwenden?

+3

Verwenden Sie ['mb_strlen()'] (http://php.net/mb-strlen) (von der MBString-Erweiterung). – BlitZ

+2

Ihre Ausgabe ist 6, da 'strlen()' Bytes ohne Berücksichtigung der Kodierung zählt. In Ihrer Kodierung (wahrscheinlich UTF8) zählt jedes Zeichen als 2 Bytes. Also ist die Ausgabe für 3 Zeichen = 6 ('3 Zeichen * 2 Byte'). – BlitZ

+1

Ich lief 'var_dump (mb_strlen ('علی'));' ich selbst, aber die Ausgabe ist immer noch 6? – bhargavg

Antwort

5

versuchen Sie dies:

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

es wird für jede PHP-Version zu arbeiten.

5

mb_strlen Funktion ist dein Freund

13

Verwenden mb_strlen

Gibt die Anzahl der Zeichen in String str mit Zeichencodierung (die zweiten Parameter) Codierung. Ein Multi-Byte-Zeichen als 1 gezählt

Da Ihr 3 Zeichen sind alle Multi-Byte, Sie erhalten 6 mit strlen zurückgegeben, aber das gibt 3 wie erwartet.

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

Fiddle

Hinweis

Es ist wichtig, nicht die Kraft dieser Methode und alle ähnlichen Alternativen zu unterschätzen. Zum Beispiel könnte man geneigt sein, ok zu sagen, wenn die Zeichen Multibyte sind, dann einfach die Länge mit strlen erhalten und sie durch 2 teilen, aber das funktioniert nur, wenn alle Zeichen deines Strings Multibyte sind und sogar ein Punkt . ungültig wird die Zählung. Zum Beispiel dieses

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

Returns 4, die korrekt ist. Also nimmt diese Funktion nicht nur die ganze Länge und teilt sie durch 2, sie zählt 1 für jedes Multi-Byte-Zeichen und 1 für jedes Single-Byte-Zeichen.

Hinweis 2:

Es sieht aus wie Sie nicht verwenden diese Methode entschieden, weil mbstring Erweiterung standardmäßig nicht für alte PHP-Versionen aktiviert ist und Sie könnten es nicht zu versuchen, damit :) obwohl Für zukünftige Leser haben entschieden Es ist nicht schwierig und es ist ratsam, es zu aktivieren, wenn Sie mit Multi-Byte-Zeichen zu tun haben, da es nicht nur die Länge ist, mit der Sie möglicherweise umgehen müssen. See Manual

+0

Dies wird immer noch '3' ausgeben, Sie müssen den' encoding' Parameter als @Rox übergeben – bhargavg

+0

Das ist richtig, behoben. –

+1

** '+ 1' ** Voller Informationen;) – dashtinejad

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

Ab PHP5 kann iconv_strlen() verwendet werden (wie in php.net beschrieben, es gibt die Anzahl der Zeichen einer Zeichenkette, so ist es wahrscheinlich die beste Wahl):

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

Basierend auf this answer von Tschernyschewski @ hotmail.com, können Sie dies versuchen:

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

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

auch, wie andere beantwortet, können Sie mb_strlen():

mb_strlen("علی"); 
// 3 
  • Es gibt einen sehr kleinen Unterschied zwischen ihnen (für illegale lateinische Zeichen):

    iconv_strlen("a\xCC\r"); // A notice 
    string_length("a\xCC\r"); // 3 
    mb_strlen("a\xCC\r"); // 2 
    
  • Performance: mb_strlen() ist die schnellste. Insgesamt gibt es keinen Unterschied zwischen iconv_strlen() und string_length() bei der Performance. Aber verblüffenderweise ist mb_strlen() schneller, als beide 9 mal (wie ich getestet habe)!

Hinweis: Fügen Sie jeder Anweisung "echo" hinzu, um sie auszugeben! ;)