Убрать из текста некоректные символы в UTF-8

Одессит

Новичок
Убрать из текста некоректные символы в UTF-8

Иногда в тексте для скрипта возникают некоректные символы UTF-8, может кто-то подскажет, как их можно удалить из текста. Или функцию даст?

Работа скрипта простая, он берёт данные из БД и формирует XML, формирую XML через DOM, но вот попалась одна запись, которая содержит некоректный символ, и при чтении XML FF выдаёт ошибку, а IE квадратики рисует в тексте на месте непонятных символов, мне вот эти квадратики и надо удалить, а я не знаю как. Думаю я не первый кто с этим сталкивается, может кто-то функцией поделиться по удалению некоректных символов?
 

Одессит

Новичок
Не подходит, пользователи сотни записей в день делают, и если я случайно попал на такую запись, то их там десятки, а может и сотни тысяч таких глючных, руками не исправишь :)

"Ингредиенты: <br />  3 стакана риса,<br />  5-6 больших головок репчатого лука,<br />  пучок зеленого лука,<br />  1 стакан сухого кизила, <br />  6-8 яиц"
 

StUV

Rotaredom
Одессит
хм... а имеет ли смысл писать в базу битый юникод, а потом каждый раз при выводе его стрипать - м.б. один раз пройтись по базе сейчас + записывать корректный текст в будущем ?
 

Одессит

Новичок
phprus
Спасибо, щас проверю.

-~{}~ 19.01.07 17:23:

Ну, там на самом интересном месте код заканчивается:
Битый UTF-8
Анализирует строку в UTF-8 и убирает «битые» символы.

PHP:
<?php
function StripBadUTF8($str) { // (C) SiMM, based on ru.wikipedia.org/wiki/Unicode
$ret = '';
for ($i = 0;$i < strlen($str); ) {
    $tmp = $str{$i++};
    $ch = ord($tmp);
    if ($ch > 0x7F) {
        if ($ch < 0xC0) continue;
        elseif ($ch < 0xE0) $di = 1;
        elseif ($ch < 0xF0) $di = 2;
        elseif ($ch < 0xF8) $di = 3;
        elseif ($ch < 0xFC) $di = 4;
        elseif ($ch < 0xFE) $di = 5;
        else continue;

        for ($j = 0;$j < $di;$j++) {
            $tmp .= $ch =  var dbclick = "page";
У кого-то есть полная версия?
 

phprus

Moderator
Команда форума
Вот:
PHP:
function StripBadUTF8($str) { // (C) SiMM, based on ru.wikipedia.org/wiki/Unicode
$ret = '';
for ($i = 0;$i < strlen($str);) {
    $tmp = $str{$i++};
    $ch = ord($tmp);
    if ($ch > 0x7F) {
        if ($ch < 0xC0) continue;
        elseif ($ch < 0xE0) $di = 1;
        elseif ($ch < 0xF0) $di = 2;
        elseif ($ch < 0xF8) $di = 3;
        elseif ($ch < 0xFC) $di = 4;
        elseif ($ch < 0xFE) $di = 5;
        else continue;

        for ($j = 0;$j < $di;$j++) {
            $tmp .= $ch = $str{$i + $j};
            $ch = ord($ch);
            if ($ch < 0x80 || $ch > 0xBF) continue 2;
        }
        $i += $di;
    }
    $ret .= $tmp;
}
return $ret;
}
 

Одессит

Новичок
Извиняюсь, это оказывается другой глюк. Я нашёл функции, которые могут удалять плохие символы, им этот показался нормальным.
Так что тогда с FF такое, чего это он глючит?
 
Сверху