Кодировка RSS потока
Делаем автоматическое определение кодировки потока при импорте.
Цель: сделать возможным импорт с сайтов с другой кодировкой
Автор: Furry
1. Открываем function/sources.php и перед самой первой функцией, то есть после
Код | 1
| if (!defined("FUNC_FILE")) die("Illegal File Access"); |
, добавляем такой код: Код | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| function detect_cyr_charset($str) {
$charsets = Array(
'k' => 0,
'w' => 0,
'd' => 0,
'i' => 0,
'm' => 0
);
for ( $i = 0, $length = strlen($str); $i < $length; $i++ ) {
$char = ord($str[$i]);
//non-russian characters
if ($char < 128 || $char > 256) continue;
//CP866
if (($char > 159 && $char < 176) || ($char > 223 && $char < 242))
$charsets['d']+=LOWERCASE;
if (($char > 127 && $char < 160)) $charsets['d']+=UPPERCASE;
//KOI8-R
if (($char > 191 && $char < 223)) $charsets['k']+=LOWERCASE;
if (($char > 222 && $char < 256)) $charsets['k']+=UPPERCASE;
//WIN-1251
if ($char > 223 && $char < 256) $charsets['w']+=LOWERCASE;
if ($char > 191 && $char < 224) $charsets['w']+=UPPERCASE;
//MAC
if ($char > 221 && $char < 255) $charsets['m']+=LOWERCASE;
if ($char > 127 && $char < 160) $charsets['m']+=UPPERCASE;
//ISO-8859-5
if ($char > 207 && $char < 240) $charsets['i']+=LOWERCASE;
if ($char > 175 && $char < 208) $charsets['i']+=UPPERCASE;
}
arsort($charsets);
return key($charsets);
} |
2. Далее находим строку Код | 1
| $content .= "<tr><td><img src="images/arrow.gif" border="0"> $pubdate_rss - <a href="$link_rss" target="_blank" title="$title_rss">$title_rss</a></td></tr><tr><td>$description_rss</td></tr>"; |
, перед ней добавляем Код | 1 2 3 4 5 6 7
| if (detect_cyr_charset($description_rss) != "w") {
$title_rss = iconv("UTF-8","cp1251", $title_rss);
$description_rss = iconv("UTF-8","cp1251", $description_rss);
$pubdate_rss = iconv("UTF-8","cp1251", $pubdate_rss);
} |
3. Находим строчку Код | 1
| list($title, $content, $url, $refresh, $otime) = $db->sql_fetchrow($db->sql_query("SELECT title, content, url, refresh, time FROM ".$prefix."_blocks WHERE bid='$bid'")); |
после неё добавляем: Код | 1 2 3 4 5 6
| if (detect_cyr_charset($content) != "w") {
$title = iconv("UTF-8","cp1251", $title);
$content = iconv("UTF-8","cp1251", $content);
} |
Что получаем: При импорте определяет кодировку потока, и если она не равна Кирилице Виндоус, то конвертируем из UTF-8 в CP1251. (например при импорте с rbc.ru)
Подходит для версии 2.1, 2.2, 2.3
Способ два.
Если необходима поддержка большего количества кодировок, делаем так:
Шаг №1 так и остаётся.
Второй код шага 2 выглядит так:
Код | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| if (detect_cyr_charset($description_rss) == "d") {
$description_rss = iconv("CP866","cp1251", $description_rss);
$title_rss = iconv("CP866","cp1251", $title_rss);
$pubdate_rss = iconv("CP866","cp1251", $pubdate_rss);
} elseif (detect_cyr_charset($description_rss) == "k") {
$description_rss = iconv("KOI8-R","cp1251", $description_rss);
$title_rss = iconv("KOI8-R","cp1251", $title_rss);
$pubdate_rss = iconv("KOI8-R","cp1251", $pubdate_rss);
} elseif (detect_cyr_charset($description_rss) == "i") {
$description_rss = iconv("ISO-8859-5","cp1251", $description_rss);
$title_rss = iconv("ISO-8859-5","cp1251", $title_rss);
$pubdate_rss = iconv("ISO-8859-5","cp1251", $pubdate_rss);
} elseif (detect_cyr_charset($description_rss) != "d" && detect_cyr_charset($description_rss) != "k" && detect_cyr_charset($description_rss) != "i" && detect_cyr_charset($description_rss) != "m" && detect_cyr_charset($description_rss) != "w") {
$description_rss = iconv("UTF-8","cp1251", $description_rss);
$title_rss = iconv("UTF-8","cp1251", $title_rss);
$pubdate_rss = iconv("UTF-8","cp1251", $pubdate_rss);
} |
Второй код шага 3 выглядит так:
Код | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| if (detect_cyr_charset($content) == "d") {
$title = iconv("CP866","cp1251", $title);
$content = iconv("CP866","cp1251", $content);
} elseif (detect_cyr_charset($content) == "k") {
$title = iconv("KOI8-R","cp1251", $title);
$content = iconv("KOI8-R","cp1251", $content);
} elseif (detect_cyr_charset($content) == "i") {
$title = iconv("ISO-8859-5","cp1251", $title);
$content = iconv("ISO-8859-5","cp1251", $content);
} elseif (detect_cyr_charset($content) != "d" && detect_cyr_charset($content) != "k" && detect_cyr_charset($content) != "i" && detect_cyr_charset($content) != "m" && detect_cyr_charset($content) != "w") {
$title = iconv("UTF-8","cp1251", $title);
$content = iconv("UTF-8","cp1251", $content);
} |
В силу иногда не очень правильной работы функции определения кодировки, без необходимости способ два не использовать!
Дата публикации: 13.06.2007 Прочитано: 12953 раз |