我们主要对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

{

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

{

$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;

}

最后,你可以简单写个程序调用一下试试,例如:

$a=”我们都会写Hello world!这个最简单的程序。”;

echo $a.”
”;

$a=substr_for_utf8($a,4);

echo $a.”
”;

?>

怎么样?不错吧,那就快来试试吧 O(∩_∩)O哈哈~

php 中文字,完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8、GBK、GB2312)相关推荐

  1. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换

    解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)--ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换 参考文章: (1)解决Qt中文乱码以及汉字编码的问题(U ...

  2. Java - char型变量中能不能存贮一个中文汉字,为什么?

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net char类型可以存储一个中文汉字,因为Java中使用 ...

  3. char 型变量中能不能存一个中文汉字?

    char 类型可以存储一个中文汉字,因为Java 中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法), 一个char 类型占2 个字节( 16 比特 ...

  4. 面试题:问题:Java中,char型变量中能不能存储一个中文汉字,为什么?

    * char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,  * 所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在  * unicod ...

  5. char型变量中能不能存储一个中文汉字?为什么?

    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么 ...

  6. 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205 一.Qt Creator环境设置 1 ...

  7. python图片中文汉字标注乱码,变成方框

    当你出现乱码试了网上多种方式还是改不好时,看看这位大哥的方法 ,抱拳了: (1条消息) Python matplotlib pyplot中title() xlabel() ylabel()无法显示在中 ...

  8. php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持

    经测试代码如下: /* Utf-8.gb2312都支持的汉字截取函数 cut_str(字符串,截取长度,开始长度,编码); 编码默认为 utf-8 开始长度默认为 0 */ function cut_ ...

  9. 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码

    本文转载自:https://www.cnblogs.com/bimingcong/p/9185472.html    首先 要明确指出一点: 编码方式是针对字符串转换之后的字节数组的,字符串并没有编码 ...

  10. eclipse导入项目后中文汉字出现乱码的解决方式

    注意: 这不是程序问题,是因为eclipse没有调节默认识别程序中字体的能力. 如下图所示,这个文件的中文有乱码: 就解决办法如下: 第一步,先把打开的这个文件关闭,然后在这个文件上右键选择属性: 然 ...

最新文章

  1. 5s的app显示无法连接服务器,苹果5s无法连接app store解决方法汇总
  2. 用vue优雅地编写UI组件的几条指导原则
  3. 懂说话,让冲突、尴尬时刻都bye-bye
  4. 项目实践:Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
  5. 随笔1106-练习例题
  6. Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案
  7. mongo笔记 // 一字一句的写下来,工作点滴片段
  8. python 类变量(属性)和实例变量(属性
  9. 数据库设计-规范化规则
  10. mysql数据库常用备份、恢复命令
  11. 机器学习实战(8):局部加强线性回归LWLR
  12. Linux 搭建zcash结点
  13. php mysql 正则表达式_mysql正则表达式(Regexp)的示例详解
  14. tomcat启动 报tomcat org.apache.catalina.LifecycleException
  15. 如何在TypeScript的`window`上显式设置新属性?
  16. js获取元素,窗口的宽度、高度
  17. 有监督学习和无监督学习
  18. thingworx- 用户组
  19. No qualifying bean of type xxx found for dependency expected at least 1 bean which qualifies as ...
  20. BZOJ.3551. [ONTAK2010]Peaks加强版

热门文章

  1. 下载SE78里面的图片
  2. ERROR 1356 (HY000): View 'information_schema. SCHEMATA'
  3. SQL 注入漏洞(二)之 mysql 注入的相关知识
  4. vs使用中遇到的问题与插件
  5. 保密计算机和移动存储介质台账,银行计算机和移动存储介质保密管理办法
  6. 呼叫转移流程分析(一)
  7. 「解读苏宁」30年门店数字化发展心法与实践分享
  8. Redis学习之lpush命令
  9. 谷歌浏览器配置微信浏览器_微信网页版 - Chrome社交与通讯插件 - 画夹插件网
  10. 宾州汉语句法依存指南 树库(3.0) 中文整理版