2011-06-11 17 views

cevap

27

Karakteri almak için mb_substr($string, 0, 1, 'utf-8') kullanın. Kodunuzdaki ne olur

PHP dizeleri bayt diziler (PHP dahili olarak kodlamaları tanımıyor) etkin bir şekilde çünkü ifade $string[0] senin dize UTF-8 kodlu temsilin ilk bayt alır olmasıdır.

Dizginizdeki ilk karakter birden fazla bayttan (UTF-8 encoding rules) oluştuğu için, yalnızca karakterin bir parçası oluyorsunuz. Üstelik, bu kurallar baytı, kendi başına bir karakter olarak ayakta durmak için geçersiz hale getiriyor, bu yüzden soru işaretini görüyorsunuz. Kodlama kurallarını bilir, bu nedenle yalnızca bir bayt geri vermeyecektir; İlk karakteri kodlamak için gereken kadar alacaktır.

Sen $string[0] size geri sadece bir bayt verdiğini görebiliriz: önünüze getiren iki bayt

$string = "üÜöÖäÄ"; 
echo strlen($string[0]); 

mb_substr ederken:

$string = "üÜöÖäÄ"; 
echo strlen(mb_substr($string, 0, 1, 'utf-8')); 

Ve bu iki bayt (aslında sadece bir karakter vardır Bunun için mb_strlen kullanmanız gerekir: Sen see most of the above in action can

$string = "üÜöÖäÄ"; 
mb_internal_encoding('utf-8'); 
echo mb_strlen(mb_substr($string, 0, 1)); 

: Marwelln aşağıda işaret gibi 'utf-8' fazlalık kurtulmak için mb_internal_encoding kullanırsanızSon olarak, durum daha tolere edilebilir hale gelir.

+1

Vay, iyi bir açıklama! – powtac

+2

http://www.php.net/manual/en/function.mb-internal-encoding.php sayfasını kullanmanızı öneririz, böylece her 'mb_' işlevinde 'utf-8' belirtmeniz gerekmeyecektir. – Marwelln

+0

UTF8 kodlanmış dizgeyi yinelemeniz gerekiyorsa, şu adrese de bakın: http://stackoverflow.com/questions/3666306/how-to-iterate-utf-8-string-in-php – Stano

İlgili konular