PHP: utf8 to numeric entities

function utf8_to_numeric_entities($str){
    $result = '';
    $len = strlen($str);
 
    for ($i = 0; $i < $len; $i++) {
        $o = ord($str[$i]);
        // detect char len
        if ($o < 0x80) $n=0; // 0bbbbbbb        
        elseif (($o & 0xE0) == 0xC0) $n=1; // 110bbbbb
        elseif (($o & 0xF0) == 0xE0) $n=2; // 1110bbbb
        elseif (($o & 0xF0) == 0xF0) $n=3; // 1111bbbb
        else {
            // invalid utf-8 string - skip
            $n = 0;
        }
        if ($n > 0) {
            // convert multibyte char
            $c = $o & (0x3F>>$n);
            // process rest of utf-8 bytes
            for ($j=0; $j<$n; $j++) { 
                // n octets that match 10bbbbbb follow ?
                if ((++$i >= $len) || ((ord($str[$i]) & 0xC0) != 0x80)) {
                    // invalid utf-8 char, try break
                    break;
                }
                $c = ($c << 6) | (ord($str[$i]) & 0x3F);
            }
            $result .= '&#'.$c.';';
        } else {
            $result .= $str[$i];
        }
    }
    return $result;
}