首页 php教程 php手册 smarty中英文多编码字符截取乱码问题解决方法

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

Jun 13, 2016 am 09:22 AM
smarty 乱码 字符串

本文实例讲述了smarty中英文多编码字符截取乱码问题解决方法,分享给大家供大家参考。具体方法如下:

一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候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 = " 
            /^(?: 
                [\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}           # 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 = &#39;&#39;&#39;&#39;;
    $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, $i, 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, $j, $bytes); 
                $length -= 1.0; 
            } 
            else 
            { 
                $result .= substr($string, $j, 1); 
                $length -= 0.5; 
            } 
        } 
    }
    return $result; 
}
function smarty_modifier_smartTruncate($string, $length = 80, $etc = &#39;&#39;...&#39;&#39;, 
                                       $break_words = false, $middle = false) 
{ 
    if ($length == 0) 
        return &#39;&#39;&#39;&#39;;
    if (smartStrlen($string) > $length) { 
        $length -= smartStrlen($etc); 
        if (!$break_words && !$middle) { 
            $string = preg_replace(&#39;&#39;/\s+?(\S+)?$/&#39;&#39;, &#39;&#39;&#39;&#39;, smartSubstr($string, 0, $length+1)); 
        } 
        if(!$middle) { 
            return smartSubstr($string, 0, $length).$etc; 
        } else { 
            return smartSubstr($string, 0, $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程序设计有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
Oracle导入中文数据时出现乱码怎么解决? Oracle导入中文数据时出现乱码怎么解决? Mar 10, 2024 am 09:54 AM

标题:解决Oracle导入中文数据乱码问题的方法及代码示例在Oracle数据库中导入中文数据时,经常会出现乱码的情况,这可能是由于数据库字符集设置不正确或者导入过程中出现编码转换问题所致。为了解决这个问题,我们可以采取一些方法来保证导入的中文数据能够正确显示。下面是一些解决方案及具体的代码示例:一、检查数据库字符集设置在Oracle数据库中,字符集的设置对于

PHP中int类型转字符串的方法详解 PHP中int类型转字符串的方法详解 Mar 26, 2024 am 11:45 AM

PHP中int类型转字符串的方法详解在PHP开发中,经常会遇到将int类型转换为字符串类型的需求。这种转换可以通过多种方式实现,本文将详细介绍几种常用的方法,并附带具体的代码示例来帮助读者更好地理解。一、使用PHP内置函数strval()PHP提供了一个内置函数strval(),可以将不同类型的变量转换为字符串类型。当我们需要将int类型转换为字符串类型时,

python怎么重复字符串_python重复字符串教程 python怎么重复字符串_python重复字符串教程 Apr 02, 2024 pm 03:58 PM

1、首先打开pycharm,进入到pycharm主页。2、然后新建python脚本,右键--点击new--点击pythonfile。3、输入一段字符串,代码:s="-"。4、接着需要把字符串里面的符号重复20次,代码:s1=s*20。5、输入打印输出代码,代码:print(s1)。6、最后运行脚本,在最底部会看到我们的返回值:-就重复了20次。

Golang字符串是否以指定字符结尾的判断方法 Golang字符串是否以指定字符结尾的判断方法 Mar 12, 2024 pm 04:48 PM

标题:Golang中判断字符串是否以指定字符结尾的方法在Go语言中,有时候我们需要判断一个字符串是否以特定的字符结尾,这在处理字符串时十分常见。本文将介绍如何使用Go语言来实现这一功能,同时提供代码示例供大家参考。首先,让我们来看一下Golang中如何判断一个字符串是否以指定字符结尾的方法。Golang中的字符串可以通过索引来获取其中的字符,而字符串的长度可

如何在Go语言中截取字符串 如何在Go语言中截取字符串 Mar 13, 2024 am 08:33 AM

Go语言是一种强大且灵活的编程语言,它提供了丰富的字符串处理功能,包括字符串截取。在Go语言中,我们可以使用切片(slice)来截取字符串。接下来,将详细介绍如何在Go语言中截取字符串,并附上具体的代码示例。一、使用切片截取字符串在Go语言中,可以使用切片表达式来截取字符串的一部分。切片表达式的语法如下:slice:=str[start:end]其中,s

Linux终端乱码问题的处理方法 Linux终端乱码问题的处理方法 Mar 20, 2024 pm 03:12 PM

Linux终端乱码问题的处理方法在使用Linux系统时,有时候在终端中显示的文字会出现乱码,这给我们使用终端带来了不便,需要及时处理。本文将为大家介绍一些常见的Linux终端乱码问题的处理方法,同时提供具体的代码示例。问题一:终端中文乱码终端中文乱码通常是由于终端的字符编码设置不正确导致的。我们可以通过修改终端的字符编码设置来解决这个问题。#查看当前终端的

Golang中如何检查字符串是否以特定字符开头? Golang中如何检查字符串是否以特定字符开头? Mar 12, 2024 pm 09:42 PM

Golang中如何检查字符串是否以特定字符开头?在使用Golang编程时,经常会遇到需要检查一个字符串是否以特定字符开头的情况。针对这一需求,我们可以使用Golang中的strings包提供的函数来实现。接下来将详细介绍如何使用Golang检查字符串是否以特定字符开头,并附上具体的代码示例。在Golang中,我们可以使用strings包中的HasPrefix

Oracle数据库中文乱码的解决策略与技巧 Oracle数据库中文乱码的解决策略与技巧 Mar 08, 2024 am 09:48 AM

Oracle数据库中文乱码的解决策略与技巧在实际的数据库应用中,很多开发者或管理员可能会遇到Oracle数据库中文乱码的问题。当数据库中的数据出现乱码时,不仅影响数据的正确性和可读性,还会给系统带来诸多问题。本文将结合具体的代码示例,介绍Oracle数据库中文乱码的解决策略与技巧,帮助读者更好地理解和解决这一问题。一、乱码产生原因字符集不一致:数据库连接和应

See all articles