function get_unicode_char_at_pos($str, $pos = 0)
{
$str = (string)$str;
if (!isset($str[$pos]))
{
return false;
}
$fb = ord($str[$pos]);
if ($fb < 128)
{
return $fb;
}
if ($fb < 192 || $fb > 253)
{
return false;
}
$mask = array(0, 31, 15, 7, 3, 1);
$cnt = 1 + ($fb > 223 ? 1 : 0) + ($fb > 239 ? 1 : 0) + ($fb > 247 ? 1 : 0) + ($fb > 251 ? 1 : 0);
$val = $fb & $mask[$cnt];
for ($i = $pos + 1; $i <= $pos + $cnt; ++$i)
{
if (!isset($str[$i]))
{
return false;
}
$fb = ord($str[$i]);
if ($fb > 192 || $fb < 128)
{
return false;
}
$val = ($val << 6) | ($fb & 63);
}
return $val;
} |