首页 后端开发 php教程 php smarty截取中文字符乱码问题?gb2312/utf-8_php模板

php smarty截取中文字符乱码问题?gb2312/utf-8_php模板

May 17, 2016 am 09:14 AM
smarty 中文字符 乱码

一般网站页面的显示都不可避免的会涉及子字符串的截取,这个时候truncate就派上用场了,但是它只适合英文用户,对与中文用户来说,使用 truncate会出现乱码,而且对于中文英文混合串来说,截取同样个数的字符串,实际显示长度上却不同,视觉上会显得参差不齐,影像美观。这是因为一个中文的长度大致相当与两个英文的长度。此外,truncate也不能同时兼容GB2312, UTF-8等编码。
改良的smartTruncate: 文件名:modifier.smartTruncate.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, $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 = '...',
$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, 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字样的原因之一。
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
2 周前 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)

word页码乱码怎么解决 word页码乱码怎么解决 Jun 25, 2023 pm 03:23 PM

word页码乱码的解决办法:1、打开word文档,点击左上角的“文件”选项;2、选择“更多”选项,再点击“选项”按钮;3、在word选项中选择“高级”;4、在“显示文档内容”中找到“显示域代码而非域值”,去掉前方的勾选,并点击确定,回到主页即可。

Linux中文乱码怎么解决 Linux中文乱码怎么解决 Feb 21, 2024 am 10:48 AM

Linux中文乱码问题是使用中文字符集和编码时常见的一个问题。出现乱码的原因可能是文件编码设置不正确,系统语言环境未安装或未设置,以及终端显示配置错误等。本文将介绍几种常见的解决方法,并提供具体的代码示例。一、检查文件编码设置使用file命令查看文件编码在终端中使用file命令,可以查看文件的编码:file-ifilename如果输出中有"charset

tomcat启动乱码如何解决 tomcat启动乱码如何解决 Dec 26, 2023 pm 05:21 PM

tomcat启动乱码的解决办法:1、修改Tomcat的conf配置文件;2、修改系统语言;3、修改命令行窗口编码;4、检查Tomcat服务器配置;5、检查项目编码;6、检查日志文件;7、尝试其他解决方案。详细介绍:1、修改Tomcat的conf配置文件,打开Tomcat的conf目录,找到"logging.properties"文件等等。

解决Windows10中文乱码问题的方法 解决Windows10中文乱码问题的方法 Jan 16, 2024 pm 02:21 PM

在Windows10系统中,出现乱码现象可谓是司空见惯。这背后的原因往往在于该操作系统并未对部分字符集提供默认的支持,抑或是设定的字符集选项存在错误。为了对症下药,以下我们将为您详细解析实际的操作规程。windows10乱码怎么解决1、打开设置,找到“时间和语言”2、再找到“语言”3、找到“管理语言设置”4、点击这里的“更改系统区域设置”5、如图勾选上然后点击确定就可以了。

win11系统文档出现乱码怎么解决 win11系统文档出现乱码怎么解决 Jun 29, 2023 pm 06:29 PM

win11文本文档乱码怎么解决?很多用户在使用win11系统的时候出现了文本文档乱码的情况而导致无法正常的进行阅读,出现这个问题很多小伙伴都不知道该如何解决。其实这个方法并不难,下面小编整理了windows11系统文档乱码解决步骤,希望能够给大家带来一点启发!windows11系统文档乱码解决步骤1、首先,打开win11的控制面板,在下面的搜索框中输入控制面板,点击搜索,进入控制面板。2、进入面板后,找到时钟和区域并点击进入,再点击区域选项。3、进入后,点击管理面板,然后再点击更改系统区域设置。

解决dll文件打开乱码问题的编辑方式 解决dll文件打开乱码问题的编辑方式 Jan 06, 2024 pm 07:53 PM

有很多的用户们在使用电脑的时候,会发现有很多的文件的尾缀是dll,但是很多的用户们都不知道这种文件需要怎么打开,想要知道的用户们快来看看以下详细教程吧~dll文件怎么打开编辑:1、下载一个叫做“exescope”的软件,并下载安装。2、然后右键dll文件,选择“用exescope编辑资源”。3、然后在弹出的错误提示框中,点击“确定”。4、然后在右边的面板上,点击每个组前面的“+”号可以查看到它所包含的内容。5、点击需要查看的dll文件,就能够看到了,然后点击“文件”,选择“导出”。6、然后就能够

解决win11记事本中的乱码问题 解决win11记事本中的乱码问题 Jan 05, 2024 pm 03:11 PM

有些朋友想要打开一个记事本,发现自己的win11记事本乱码,不知道怎么办,其实我们一般只需要修改区域和语言就可以了。win11记事本乱码:第一步,使用搜索功能,搜索并打开“控制面板”第二步,点击时钟和区域下的“更改日期、时间或数字格式”第三步,点击上方的“管理”选项卡。第四步,点击下方“更改系统区域设置”第五步,将当前系统区域设置改为“中文(简体,中国)”并“确定”保存即可。

filezilla乱码怎么解决 filezilla乱码怎么解决 Nov 20, 2023 am 10:16 AM

filezilla乱码的解决办法有:1、检查编码设置;2、检查文件本身;3、检查服务器配置;4、尝试其他传输工具;5、更新软件版本;6、检查网络问题;7、寻求技术支持。解决FileZilla乱码问题需要从多个方面入手,逐步排查问题原因,并采取相应的措施进行修复。

See all articles