加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

smarty中英文多编码字符截取乱码问题解决方法

发布时间:2020-12-13 02:06:09 所属栏目:PHP教程 来源:网络整理
导读:《:smarty中英文多编码字符截取乱码问题解决方法》要点: 本文介绍了:smarty中英文多编码字符截取乱码问题解决方法,希望对您有用。如果有疑问,可以联系我们。 PHP编程 本篇章节讲解smarty中英文多编码字符截取乱码问题解决办法,供大家参考研究.

《:smarty中英文多编码字符截取乱码问题解决方法》要点:
本文介绍了:smarty中英文多编码字符截取乱码问题解决方法,希望对您有用。如果有疑问,可以联系我们。

PHP编程本篇章节讲解smarty中英文多编码字符截取乱码问题解决办法,分享给大家供大家参考.具体办法如下:

PHP编程一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,视觉上会显得参差不齐,影响美观.这是因为一个中文的长度大致相当于两个英文的长度.此外,truncate也不能同时兼容GB2312,UTF-8等编码.
改良的smartTruncate: 文件名:modifier.smartTruncate.php
具体代码如下:

代码如下:
<?php
function smartDetectUTF8($string)
{
??? static $result = array();
??? if(! array_key_exists($key = md5($string),$result))
??? {
??????? $utf8 = "
??????????? /^(?:
??????????????? [x09x0Ax0Dx20-x7E]??????????????????????????? # ASCII
??????????????? | [xC2-xDF][x80-xBF]???????????????????????????? # non-overlong 2-byte
??????????????? | xE0[xA0-xBF][x80-xBF]?????????????????????? # excluding overlongs
??????????????? | [xE1-xECxEExEF][x80-xBF]{2}?????????? # straight 3-byte
??????????????? | xED[x80-x9F][x80-xBF]????????????????????? # excluding surrogates
??????????????? | xF0[x90-xBF][x80-xBF]{2}???????????????? # planes 1-3
??????????????? | [xF1-xF3][x80-xBF]{3}????????????????????????? # planes 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 = false)
{
??? if ($length == 0)
??????? return '''';
??? if (smartStrlen($string) > $length) {
??????? $length -= smartStrlen($etc);
??????? if (!$break_words && !$middle) {
??????????? $string = preg_replace(''/s+?(S+)?$/'','''',smartSubstr($string,$length+1));
??????? }
??????? if(!$middle) {
??????????? return smartSubstr($string,$length).$etc;
??????? } else {
??????????? return smartSubstr($string,$length/2) . $etc . smartSubstr($string,-$length/2);
??????? }
??? } else {
??????? return $string;
??? }
}
?>

以上代码完整实现了truncate的原有功能,而且可以同时兼容GB2312和UTF-8编码,在判断字符长度的时候,一个中文字符算1.0,一个英文字符算0.5,所以在截取子字符串的时候不会出现参差不齐的情况.
插件的使用方式没有特别之处,这里简单测试一下:
代码如下:
{$content|smartTruncate:5:".."}($content等于"A中B华C人D民E共F和G国H")

显示:A中B华C.. (中文符号长度算1.0,英文符号长度算0.5,并且考虑省略符号的长度)
不管你是使用GB2312编码还是UTF-8编码,你会发现结果都正确,这也是为什么我在插件名字里加上smart字样的原因之一.

PHP编程希望本文所述对大家的PHP程序设计有所赞助.

《:smarty中英文多编码字符截取乱码问题解决方法》是否对您有启发,欢迎查看更多与《:smarty中英文多编码字符截取乱码问题解决方法》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读