проблемма с русским языком в обрезаных заголовках

Статус
В этой теме нельзя размещать новые ответы.

krushanovskij

Создатель
Регистрация
26 Фев 2009
Сообщения
16
Реакции
0
добрый вечер, коллеги, не знаю, в той ли теме я создал сообщение, но, так как других подходящих тем для постинга я не нашел - прошу помощи тут.
у меня есть сайт. на нем стоит скрипт phpmelody 1.6
шикарный скрипт, но в нем есть один недостаток.
русские буквы в заголовках, которые обрезаются - отображаются некоректно.
а именно: РазвÑ�аÑ�наÑ.. (и подобые символы)
опытным путем я понял - что это проблемма кодировки, именно - latin1 или как ее еще называют ISO-8859-1
хотя должна быть UTF8.
в базе данных все нормально, русский текст отображается как надо, вся база в utf8_general_ci.
я уже несколько дней ломаю себе над этим голову - все никак не осилю.
повторюсь, и уточню еще раз:
пролемма возникает ТОЛЬКО в русских заголовках. и ТОЛЬКО в тех - которые обрезаются(насколько я понял - плагином Smarty - modifier.truncate.php)
ps: модераторы, если моя тема не подходит для этого раздела, или в другом мне смогут помочь более - перенесите ее пожалуйста.
pps: прошу не отвечать тех людей - которые не разбираются в теме, и не могут реально помочь.
заранее спасибо.
 
Здесь проблема в функции "обрезания", а точнее в кодировке utf-8: русские символы этой кодировки записываются 2-мя байтами, а т.к. ваша функция не знает об этом, она может отрезать половину буквы(1 байт от буквы). Такая проблема встречалась мне при работе с wap-сайтами. К примеру, браузер Opera выведет только обрезанный символ кракозябрами, а firefox может весь заголовок "поломать".

Одним из решений может быть сначала конвертация, например, в windows-1251 кодировку, обрезание, конвертация обратно в utf-8.
Первое решение, которое пришло на ум.
 
спасибо конечно, но, помойму - это не вариант, так как это чересчур сложно.
может у Вас еще есть идеи по этому поводу?

кстати, как вариант - еще можно полность попробовать конвертнуть всю базу в WIN1251, и в конфиге тоже прописать вместо UTF-8, WINDOWS1251, что Вы думаете по этому поводу?
 
Вспомнил, есть такая функция как mb_substr, как раз для работы с кодировками типа utf-8
Если phpmelody обрезает заголовки функцией substr, то просто следует заменять substr на mb_substr
Для просмотра ссылки Войди или Зарегистрируйся
Важная особенность, 4-ым параметром этой функции должна указываться кодировка строки, с которой предстоит работа, например:
PHP:
$a = mb_substr($b,0,2,'UTF-8');
или же заранее установить кодировку для таких функций: mb_internal_encoding("UTF-8");
 
Вспомнил, есть такая функция как mb_substr, как раз для работы с кодировками типа utf-8
Если phpmelody обрезает заголовки функцией substr, то просто следует заменять substr на mb_substr
Для просмотра ссылки Войди или Зарегистрируйся
Важная особенность, 4-ым параметром этой функции должна указываться кодировка строки, с которой предстоит работа, например:
PHP:
$a = mb_substr($b,0,2,'UTF-8');
или же заранее установить кодировку для таких функций: mb_internal_encoding("UTF-8");

я так понял, я могу в конфиге просто прописать где угодно mb_internal_encoding("UTF-8");
и все будет гуд?
или не в конффиге?
 
Ну это уже где удобнее, главное - до вызова функции mb_substr
 
дело в том, что я не могу похвастаться глубокими познаниями в пхп. и в данном случае попросту не представляю, куда нужно его запихнуть.
это целая строка? перед ней, или после нее ниче не нужно всталять?
просто я не знаю, либо в плагины смарти ее засунуть, либо в сеттингс, либо ще куда...
 
ИМХО, должно работать если закинуть в "сеттингс" и если он подгружается в начале файла.
вы главное не забудьте substr на mb_substr заменить, а то от одного mb_internal_encoding("UTF-8"); толку мало. ;)
 
вот действиями этого файла я обрезаю строку. Можете на примере показать, что и как, пожалуйста.

PHP:
<?php
/**
 * Smarty plugin
 * @package Smarty
 * @subpackage plugins
 */


/**
 * Smarty truncate modifier plugin
 *
 * Type:     modifier<br>
 * Name:     truncate<br>
 * Purpose:  Truncate a string to a certain length if necessary,
 *           optionally splitting in the middle of a word, and
 *           appending the $etc string or inserting $etc into the middle.
 * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
 *          truncate (Smarty online manual)
 * @author   Monte Ohrt <monte at ohrt dot com>
 * @param string
 * @param integer
 * @param string
 * @param boolean
 * @param boolean
 * @return string
 */
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false, $middle = false)
{
    if ($length == 0)
        return '';

    if (strlen($string) > $length) {
        $length -= min($length, strlen($etc));
        if (!$break_words && !$middle) {
            $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
        }
        if(!$middle) {
            return mb_substr($string, 0, $length) . $etc;
        } else {
            return mb_substr($string, 0, $length/2) . $etc . mb_substr($string, -$length/2);
        }
    } else {
        return $string;
    }
}

/* vim: set expandtab: */

?>

в этом файле я уже заменил substr на mb_substr.
файлик называется modifier.truncate.php
 
Можете на примере показать, что и как, пожалуйста.
в этом файле я уже заменил substr на mb_substr.
файлик называется modifier.truncate.php
ну вот, после <?php надо воткнуть mb_internal_encoding("UTF-8");
на примере:
PHP:
<?php
mb_internal_encoding("UTF-8");
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false, $middle = false)
{
    if ($length == 0)
        return '';
    if (strlen($string) > $length) {
        $length -= min($length, strlen($etc));
        if (!$break_words && !$middle) {
            $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1));
        }
        if(!$middle) {
            return mb_substr($string, 0, $length) . $etc;
        } else {
            return mb_substr($string, 0, $length/2) . $etc . mb_substr($string, -$length/2);
        }
    } else {
        return $string;
    }
}
?>
или просто добавить 4-й параметр в функцию mb_substr
PHP:
<?php
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
                                  $break_words = false, $middle = false)
{
    if ($length == 0)
        return '';
    if (strlen($string) > $length) {
        $length -= min($length, strlen($etc));
        if (!$break_words && !$middle) {
            $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length+1,"UTF-8"));
        }
        if(!$middle) {
            return mb_substr($string, 0, $length,"UTF-8") . $etc;
        } else {
            return mb_substr($string, 0, $length/2,"UTF-8") . $etc . mb_substr($string, -$length/2,,"UTF-8");
        }
    } else {
        return $string;
    }
}
?>
оба варианта должны работать
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху