Here's how to use grapheme_extract() to loop across a UTF-8 string character by character. <?php $str = "سabcक’…"; // if the previous line didn't come through, the string contained: //U+0633,U+0061,U+0062,U+0063,U+0915,U+2019,U+2026 $n = 0; for ( $start = 0, $next = 0, $maxbytes = strlen($str), $c = ''; $start < $maxbytes; $c = grapheme_extract($str, 1, GRAPHEME_EXTR_MAXCHARS , ($start = $next), $next) ) { if (empty($c)) continue; echo "This utf8 character is " . strlen($c) . " bytes long and its first byte is " . ord($c[0]) . "\n"; $n++; } echo "$n UTF-8 characters in a string of $maxbytes bytes!\n"; // Should print: 7 UTF8 characters in a string of 14 bytes! ?>