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程序设计有所帮助。