PHP
发布时间:2019-11-16 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php smarty截取中文字符乱码问题?gb2312/utf-8,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,视觉上会显得参差不齐,影像美观。这是因为一个中文的长度大致相当与两个英文的长度。此外,truncate也不能同时兼容GB2312,UTF-8等编码。
改良的smartTruncate: 文件名:modifier.smartTruncate.php
<div class="codetitle">@H_489_3@<a style="cursOR: pointer" data="67290" class="copybut" id="copybut67290" onclick="doCopy('code67290')"> 代码如下:
<div class="codebody" id="code67290">
<?
php function
smartDetectUTF8($
String)
{ static $result = array(
); if(! array_key_exists($key = md5($
String),$result))
{ $utf8 = "
/^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]
{2} # s
Traight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]
{2} # pla
nes 1-3
| [\xF1-\xF3][\x80-\xBF]
{3} # pla
nes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]
{2} # plane 16
)+$/xs
";
$
result[$key] = preg_match(trim($utf8),$
String
); }
return $
result[$key];
}
function
smartStrlen($
String)
{ $result = 0;
$
number =
smartDetectUTF8($
String) ? 3 : 2;
for($i = 0; $i < strlen($
String
); $i += $bytes)
{ $bytes = ord(substr($
String,$i,1)) > 127 ? $
number : 1;
$result += $bytes > 1 ? 1.0 : 0.
5; }
return $result;
}
function
smartSubstr($
String,$start,$length = null)
{ $result = '';
$
number =
smartDetectUTF8($
String) ? 3 : 2;
if($start < 0)
{ $start = max(
smartStrlen($
String) + $start,0
); }
for($i = 0; $i < strlen($
String
); $i += $bytes)
{ if($start <= 0)
{ break;
}
$bytes = ord(substr($
String,1)) > 127 ? $
number : 1;
$start -= $bytes > 1 ? 1.0 : 0.
5; }
if(is_null($length))
{ $result = substr($
String,$i
); }
else
{ for($j = $i; $j < strlen($
String
); $j += $bytes)
{ if($length <= 0)
{ break;
}
if(($bytes = ord(substr($
String,$j,1)) > 127 ? $
number : 1) > 1)
{ if($length < 1.0)
{ break;
}
$result .= substr($
String,$bytes
); $length -= 1.0;
}
else
{ $result .= substr($
String,1
); $length -= 0.
5; }
}
}
return $result;
}
function
smarty_modifier_
smartTruncate($
String,$length = 80,$etc = '...',
$break_words =
false,$middle =
fals
E) { if ($length == 0)
return '';
if (
smartStrlen($
String) > $length)
{ $length -=
smartStrlen($etc
); if (!$break_words && !$middl
E) { $
String = preg_
replace('/\s+?(\S+)?$/','',
smartSubstr($
String,$length+1)
); }
if(!$middl
E) { return
smartSubstr($
String,$length).$et
c; } else
{ return
smartSubstr($
String,$length/2) . $etc .
smartSubstr($
String,-$length/2
); }
} else
{ return $
String;
}
}
?>
以上代码完整实现了truncate的原有功能,而且可以同时兼容GB2312和UTF-8编码,在判断字符长度的时候,一个中文字符算1.0,一个英文字符算0.5,所以在截取子字符串的时候不
参差不齐的情况.
显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且