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; }