我们主要对utf8、GBK、GB2312的截取中文字符串进行讲解,完美解决截取中文汉字不乱码-PHP字符串函数:
1、截取GB2312以及GBK编码的字符串
函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字
$str————截取源字符串
$len————截取长度(2代表一个汉字)
PS:该函数不能用于utf8编码字符串,会出现乱码
function splitStr($str,$len)
{
if($len<=0)
{
return false;
}
else
{
$sLen=strlen($str);
if($len>=$sLen)
return $str;
else
{
for($i=0;$i<($len-1);$i++)
{
if(ord(substr($str,$i,1))>0xa0)
$i++;
}
if($i>=$len)
return substr($str,0,$len);
elseif(ord(substr($str,$i,1))>0xa0)
return substr($str,0,$len-1);
else
return substr($str,0,$len);
}
}
}
2、截取GB2312以及GBK编码的字符串
函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字
$str————截取源字符串
$start———-起始位置,不能为空,从1算起
$len————截取长度(2代表一个汉字),如果为空则截取到字符串末尾
PS:该函数不能用于utf8编码字符串,会出现乱码
function substr_for_gb2312($str,$start,$len=null)
{
$totlelength = strlen($str);
//特例情况
if ($len == null) $len = $totlelength;
if ($len ==0) return “”;
if ($len >= $totlelength && $start == 0 ) return $str;
if ($start > $totlelength) return “”;
//分析$start
if ($start < 0 ) //$start<0时,转化为$start>0时的定位.
{
if ( abs($start) >= $totlelength )
$start = 0;
else
$start = $totlelength – abs($start);
}
//确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
if ($start > 0)
{
$i = $start-1;
$flag = -1;
while ($i >= 0)
{
if ( ord(substr($str,$i,1)) > 160)
{
$flag = -1*$flag;
}
else break;
$i–;
}
if($flag==1)
{
$start = $start – 1;
$len++; //保证不位移.
}
}
$str = substr($str,$start);//截除字符串$str的$start位前的字符
$totlelength = strlen($str);
//确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
if ($len<0) $len = $totlelength – abs($len);
if ($len <= 0) return “”;
$i=min($len,$totlelength);
$i–;
$flag = -1;
while ($i >= 0)
{
if (ord(substr($str,$i,1))>160)
{
$flag=-1*$flag;
}
else break;
$i–;
}
if($flag == 1) $len=$len-1;
$subit=substr($str,0,$len);
return $subit;
}
3、截取utf8或GB2312或者GBK编码的字符串
函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字
$sourcestr————截取源字符串
$cutlength————截取长度(字数)
PS:这个函数很万能,但是相对前两个耗资源一些
function substr_for_utf8($sourcestr,$cutlength)
{
$returnstr=”;
$i=0;
$n=0;
$str_length=strlen($sourcestr); //字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码
if ($ascnum>=224) //如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum>=192)//如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
}
elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else //其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽…
}
}
if ($str_length>$cutlength)
{
$returnstr = $returnstr . “…”; //超过长度时在尾处加上省略号
}
return $returnstr;
}
最后,你可以简单写个程序调用一下试试,例如:
<?php
$a=”我们都会写Hello world!这个最简单的程序。”;
echo $a.”<br />”;
$a=substr_for_utf8($a,4);
echo $a.”<br />”;
?>
怎么样?不错吧,那就快来试试吧 O(∩_∩)O哈哈~
相关推荐
SQL截取字符串函数(1、截取从字符串左边开始N个字符 2、截取从字符串右边开始N个字符(例如取字符www.163.com) 3、截取字符串中任意位置及长度 等等)
impala的substr()和substring()函数是不支持中文的,创建一个udf解决impala sql中substr()函数截取中文字符串乱码的问题
Gbase 8s内置函数之字符串函数
Delphi 字符串截取函数详细应用以及例子
1、截取GB2312字符用的函数 PHP代码 复制代码 代码如下: <?php //截取中文字符串 function mysubstr($str, $start, $len) { $tmpstr = “”; $strlen = $start + $len; for($i = 0; $i < $strlen; $i++) { if...
但字符串只要出现中文字符,就有可能导致PHP substr中文乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将一个中文字符“锯”成两半,造成断开的字符会...
js截取字符串函数.txt
支持utf-8和gb2312编码。若为gb2312,先将其转为utf-8,在utf-8的基础上截取然后再转换回来 function cut_string($str,$from=1,$length=10,$code=’utf-8′,$rear=’…’){ if($code!=’utf-8′){//总是将字符串转为...
字符串截取,支持中文、UTF8和其他编码。
本文实例讲述了php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8用法。分享给大家供大家参考,具体如下: /* *gb2312中文字符串截取 */ function substr_for_gb2312($str,$start,$len=null) { $...
解决截取字符串中带有汉字的问题,以防截取时汉字截取一般出现错误情况
最近需要用到按字节数截取字符串。在网上找了很多方法。 Encoding.Default.GetString采用的Default Encoding.UTF8.GetBytes采用的是utf-8编码。这样当然是乱码。尤其出现中文时候。 对这类数据处理当然要用统一的...
ORACLE PL/SQL 字符串函数、数学函数、日期函数 --【字符串函数】 --字符串截取substr(字段名,起始点,个数) select Name,substr(Name,2,4),substr(Name,0,3),substr(Name,-2,3),substr(Name,-2,1) from t1; --字符...
在PHP中,使substr函数截取字符串末位会出现乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位不准确,造成断开的字符会把其后的..拉过来一起做一个字,所以出现了乱码。
delphi 实现截取字符串中中文+英文混合截取,当字符串中包含中文和英文支付时,有时候会将一个中文截取1半,出现乱码。该demo能很好的解决该问题
复制代码 代码如下:function utf8_substr($str,$len) { for($i=0;$i<$len;$i++) { $temp_str=substr($str,0,1); if(ord($temp_str) > 127){ $i++; if($i<$len){ $new_str[]=substr($str,0,3); $str=substr($...
一个php截取指定字符串之间的字符串的类,介绍一个php截取指定字符串之间的字符串的类,需要的朋友可以自行下载学习使用。
自己输入一个字符串,字符串中可以包括字符和汉字,截取指定的字符串