Bir UTF-8 dizesi kullanırken bir sorunla karşılaştım. Ben örneğin, dize tek bir karakter okumak istiyorum: Ben ü
görmeyi bekliyorumUTF-8 dizesinde dizi dizini kullanılırken yanlış çıktı
$string = "üÜöÖäÄ";
echo $string[0];
ama olsun - neden?
Bir UTF-8 dizesi kullanırken bir sorunla karşılaştım. Ben örneğin, dize tek bir karakter okumak istiyorum: Ben ü
görmeyi bekliyorumUTF-8 dizesinde dizi dizini kullanılırken yanlış çıktı
$string = "üÜöÖäÄ";
echo $string[0];
ama olsun - neden?
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.
Vay, iyi bir açıklama! – powtac
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
UTF8 kodlanmış dizgeyi yinelemeniz gerekiyorsa, şu adrese de bakın: http://stackoverflow.com/questions/3666306/how-to-iterate-utf-8-string-in-php – Stano