Крякозябры при обрезание текста.

12
Руслан Исмаилов
На сайте с 30.03.2007
Offline
198
853

Добрый день.

Мне вот интересно от куда берется данный косяк:


Кто что посоветует?

A
На сайте с 19.07.2010
Offline
130
#1

смотреть в сторону mb_* функций, т.е. http://php.net/manual/ru/function.mb-substr.php

заменить substr на mb_substr и так далее

.............
SeVlad
На сайте с 03.11.2008
Offline
1609
#2
musulman:

Мне вот интересно от куда берется данный косяк:

/ru/forum/comment/11654155

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
siv1987
На сайте с 02.04.2009
Offline
427
#3

Вы режете многобайтные строки функцией для однобайтных.

C
На сайте с 04.02.2005
Offline
291
#4
siv1987:
Вы режете многобайтные строки функцией для однобайтных.

:)

Любая строка многосимвольная (исключение составляют пустые и строка с одним байтом=один символ).

А вот кодировка строк бывает однобайтная (ASCII, cp1251, например) и многобайтная (UTF-8, например)

для однобайтной кодировки вполне может подойти и substr (что у ТС используется)

для многобайтных кодировок ... http://ua2.php.net/manual/ru/book.mbstring.php

ps. siv1987, я вас понял...

Руслан Исмаилов
На сайте с 30.03.2007
Offline
198
#5
admak:
смотреть в сторону mb_* функций, т.е. http://php.net/manual/ru/function.mb-substr.php

заменить substr на mb_substr и так далее

Вот мои исходный код:


<?php

if( ! defined( 'DATALIFEENGINE' ) ) {
die( "Hacking Attempt!" );
}


function cutString( $text, $maxchar){



$text=substr($text,0,$maxchar);



return $text;

}


//$commentslast = dle_cache( "comments-last", $config['skin'] );

if( ! $commentslast ) {

include( ROOT_DIR . "/engine/data/comments-last.php" );

if( $commentslast['on'] == "1" ) {

define( "LIMITCOMM", "5" );
define( "LIMITTITL", $commentslast['titlelimit'] );
define( "SHOWHITHB", $commentslast['showhint'] );



$sql = $db->query( "SELECT comments.post_id, comments.date as comdate, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.category, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0, " . LIMITCOMM );

while( $row = $db->get_row($sql) ) {

$date_t=$row['comdate'];

$row['date'] = strtotime($row['date']);
$row['newsdate'] = strtotime($row['newsdate']);
$row['date'] = strtotime($row['date']);

if( strlen( $row['title']) > LIMITTITL )
$title = substr( $row['title'], 0, LIMITTITL )."...";
else
$title = $row['title'];

if( strlen( $row['text'] ) > 300 )
$text = htmlspecialchars( stripslashes( substr ($row['text'], 0, 300)."11..." ) );

if(! $row['is_register'] == "1" ) {

if( $row['email'] != "") {

if( preg_match( "/^[\.A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{1,4}$/", $row['email'] ) ) { $url_target = ""; $mail_or_url = "mailto:"; }

else {
$url_target = "target=\"_blank\"";
$mail_or_url = "";

if( substr( $row, 0, 3 ) == "www" ) { $mail_or_url = "http://"; } }

if( $mail_or_url == "mailto:" ) {

$email = explode("@", $row['email'], 2);
$autor = "<script>var em0 = '$email[0]'; document.write('<a href=\"mailto:' + em0 + '@$email[1]\">" . $row['autor'] . "</a>');</script>";

} else {

$autor = "<a $url_target href=\"$mail_or_url" . $row . "\">" . $row['autor'] . "</a>"; }

} else { $autor = $row['autor']; }

} else {

if( $config['allow_alt_url'] == "yes" ) {

$autor = "" . $row['autor'] . "";

} else {

$autor = "" . $row['autor'] . ""; } }

$row['date'] = strtotime( $row['date'] );
$row['category'] = intval( $row['category'] );

if( $config['allow_alt_url'] == "yes" ) {
if( $row['flag'] ) {
$full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
} else {
$full_link = $config['http_home_url'] . $row['id'] . $row['alt_name'] . ".html";
}
} else {
$full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
}

$full_link = $config['http_home_url'] . get_url($row['category']). "/" .$row['id'] . "-" . $row['alt_name'] . ".html";

$post = "<a href=\"" . $full_link . "#comment\">" . stripslashes( $title ) . "</a>";

$maimt = '<b>' . $row['autor'] . ' Написал:</b><br /><br />';

$text = strip_tags( stripslashes( $row['text'] ) );



$copy = '<hr /><div align=right>' . $commentslast['copyright'] . '</div>';
$width = $commentslast['width'] . 'px';

if( SHOWHITHB == "yes" ) {
$box = "onmouseover=\"showhint('{$maimt} {$text} {$copy}', this, event, '{$width}')\"";
}

//$lcomm .= "<div {$box}><div onmouseover=\"this.className='lastcomm_over';\" onmouseout=\"this.className='lastcomm';\" class=\"lastcomm\"> {$commentslast['sstrat']} {$autor} {$commentslast['scenter']} {$post}</div></div>"; }

//$commentslast= "<script type=\"text/javascript\" src=\"" . $config['http_home_url'] . "engine/skins/default.js\"></script>" . $lcomm . "";

$text=cutString($text,100)."...";
$lcom .=<<<HTML
<div class="blockbox">
<h2>$post</h2>
<div class="smallt">$text</div>
</div>
HTML;
}
$commentslast=$lcom;
$db->free();
create_cache( "comments-last", $commentslast, $config['skin'] );

} else {

$commentslast= "Модуль отключен в Панели Управления...";

}

}

echo $lcom;
?>

Что там на что заменить нужно, подскажите. Заранее спасибо.

Хелпзонович
На сайте с 15.06.2005
Offline
133
#6

Искать функцию cutString() и в ней менять substr на mb_substr или что там у нее внутри

Вы там держитесь! Хорошего вам настроения. Здоровья.
Руслан Исмаилов
На сайте с 30.03.2007
Offline
198
#7
Хелпзонович:
Искать функцию cutString() и в ней менять substr на mb_substr или что там у нее внутри

Не помогло.

C
На сайте с 04.02.2005
Offline
291
#8

string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )

Укажите явно кодировку

Руслан Исмаилов
На сайте с 30.03.2007
Offline
198
#9

Chukcha, можно по подробнее? если честно в php вообще не силен. тыком и на абу :)

Исходный код

Буду очень признателен.

C
На сайте с 04.02.2005
Offline
291
#10

не.... ну... вот же!!!!

 function cutString( $text, $maxchar){

$text=substr($text,0,$maxchar);
$text=mb_substr($text,0,$maxchar, 'явно указать кодировку');
return $text;
}
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий