Smarty和英语多编码字符截取的问题解决方法

本文介绍了Smarty和英语多编码字符截取的解决问题的方法,供你参考大家共享,具体方法如下:

一般的网页显示不可避免地涉及截取字符串,这个时候将会派上用场,但它只适用于英语的用户,中国用户,使用截断会乱码,也为中英文混合字符串,相同数量的字符串截取,实际显示的长度不同,视觉会出现不均匀,影响美观。这是因为汉语的长度大致等于两个英文的长度。此外,截断无法兼容GB2312,UTF-8编码,及其他。

改进的smarttruncate:文件名:modifier.smarttruncate.php

具体代码如下:

复制代码代码如下:< PHP

功能smartdetectutf8($字符串)

{

静态结果=数组();

如果(!array_key_exists($key = MD5($字符串),$结果)

{

= $ UTF8

(:

{ x09 x0a x0d X20 - x7e ASCII # }

{ XC2 - XDF } { X80 - XBF }非超长字节| #

xe0 { xA0 - XBF } { X80 - XBF }不包括overlongs | #

{ XE1 - XeF XEC夕} { X80 - XBF } { 2 }直| # 3字节

固定{ X9F } { X80 - X80 - XBF }不包括代理人| #

xf0 { X90 - XBF } { X80 - XBF } { 2 }面| # 1-3

{ XF1 - xf3 } { X80 - XBF } { 3 }面4-15 | #

| # 幅国土{ X80 - x8f } { X80 - XBF } { 2 }平面16

+ $ / XS)



结果{ } =美元美元的关键preg_match(TRIM($ UTF8),为字符串);

}

返回结果$ {键};

}

功能smartstrlen($字符串)

{

$结果=0;

smartdetectutf8美元数量=($string)3:2;

为($我= 0;$我< strlen($字符串);$我= $字节)

{

$字节= ORD(substr($字符串,我,1))> 127元数:1;

$结果= $字节> 11:0.5;

}

返回$结果;

}

功能smartsubstr(美元美元美元开始,字符串,长度= null)

{

结果=;

smartdetectutf8美元数量=($string)3:2;

如果($开始0)

{

开始= max(smartstrlen美元($字符串)+ $开始,0);

}

为($我= 0;$我< strlen($字符串);$我= $字节)

{

如果(0美元开始)

{

打破;

}

$字节= ORD(substr($字符串,我,1))> 127元数:1;

$开始= $字节> 11:0.5;

}

如果(is_null($长度))

{

结果= substr(美元美元美元的字符串,我);

}

其他的

{

为(J =我;J < strlen($字符串);J = $字节)

{

如果(0美元)

{

打破;

}

如果(($字节= ORD(substr(substr($字符串,J,1))> 127美元数量:1)> 1)

{

如果(长度<1)

{

打破;

}

结果= substr(美元美元美元美元字节字符串,J);

$长度= 1;

}

其他的

{

结果= substr(美元$弦,J,1);

$长度= 0.5;

}

}

}

返回$结果;

}

功能smarty_modifier_smarttruncate(字符串长度= 80美元,美元,美元等= ',

break_words美元= false,中= false)

{

如果(长度= 0)

返回' ' ';

如果(smartstrlen(字符串长度>美元)美元){

长度= smartstrlen美元(美元等);

如果(!break_words美元!$中){

$字符串preg_replace( / +( +)$ / ','($ 0美元,smartsubstr字符串,长度+ 1));

}

如果(!$中){

返回smartsubstr($字符串,0美元美元,长度等);

{人}

返回smartsubstr($ 0美元的字符串,长度/ 2)。smartsubstr美元(美元等字符串,长度/ 2美元);

}

{人}

返回$字符串;

}

}

>

上面的代码实现了原有功能的截形,并可与GB2312和UTF-8编码兼容,判断字符长度时,一个汉字算1,一个英文字符是0.5,所以不均匀的情况不会出现在时间截取子字符串。

插件的使用没有什么特别的。下面是一个简单的测试。

复制代码如下:{ $内容| smarttruncate:5:,}($含量等于B Hua C人D人E、F和G H )

显示:B。在a(中文符号长度为1,英文符号的长度为0.5,并考虑省略号的长度)。

无论你使用GB2312编码或UTF-8编码,你会发现结果是正确的,这就是为什么我添加的插件名聪明的话。

希望本文能对大家的PHP程序设计有所帮助。