php 中文字,完善解决截取中文汉字不乱码-PHP字符串函数(支持utf8、GBK、GB2312)
我们主要对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)相关推荐
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)--ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换 参考文章: (1)解决Qt中文乱码以及汉字编码的问题(U ...
- Java - char型变量中能不能存贮一个中文汉字,为什么?
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net char类型可以存储一个中文汉字,因为Java中使用 ...
- char 型变量中能不能存一个中文汉字?
char 类型可以存储一个中文汉字,因为Java 中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法), 一个char 类型占2 个字节( 16 比特 ...
- 面试题:问题:Java中,char型变量中能不能存储一个中文汉字,为什么?
* char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字, * 所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在 * unicod ...
- char型变量中能不能存储一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么 ...
- 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)
尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205 一.Qt Creator环境设置 1 ...
- python图片中文汉字标注乱码,变成方框
当你出现乱码试了网上多种方式还是改不好时,看看这位大哥的方法 ,抱拳了: (1条消息) Python matplotlib pyplot中title() xlabel() ylabel()无法显示在中 ...
- php函数汉语,PHP汉字截取函数:UTF-8、GB2312双支持
经测试代码如下: /* Utf-8.gb2312都支持的汉字截取函数 cut_str(字符串,截取长度,开始长度,编码); 编码默认为 utf-8 开始长度默认为 0 */ function cut_ ...
- 字符串转码中文乱码问题的进一步理解 UTF-8 GBK转码
本文转载自:https://www.cnblogs.com/bimingcong/p/9185472.html 首先 要明确指出一点: 编码方式是针对字符串转换之后的字节数组的,字符串并没有编码 ...
- eclipse导入项目后中文汉字出现乱码的解决方式
注意: 这不是程序问题,是因为eclipse没有调节默认识别程序中字体的能力. 如下图所示,这个文件的中文有乱码: 就解决办法如下: 第一步,先把打开的这个文件关闭,然后在这个文件上右键选择属性: 然 ...
最新文章
- 5s的app显示无法连接服务器,苹果5s无法连接app store解决方法汇总
- 用vue优雅地编写UI组件的几条指导原则
- 懂说话,让冲突、尴尬时刻都bye-bye
- 项目实践:Spring Boot 三招组合拳,手把手教你打出优雅的后端接口
- 随笔1106-练习例题
- Spring Boot——MyBatis配置带下划线命名的字段自动转换驼峰命名解决方案
- mongo笔记 // 一字一句的写下来,工作点滴片段
- python 类变量(属性)和实例变量(属性
- 数据库设计-规范化规则
- mysql数据库常用备份、恢复命令
- 机器学习实战(8):局部加强线性回归LWLR
- Linux 搭建zcash结点
- php mysql 正则表达式_mysql正则表达式(Regexp)的示例详解
- tomcat启动 报tomcat org.apache.catalina.LifecycleException
- 如何在TypeScript的`window`上显式设置新属性?
- js获取元素,窗口的宽度、高度
- 有监督学习和无监督学习
- thingworx- 用户组
- No qualifying bean of type xxx found for dependency expected at least 1 bean which qualifies as ...
- BZOJ.3551. [ONTAK2010]Peaks加强版
热门文章
- 下载SE78里面的图片
- ERROR 1356 (HY000): View 'information_schema. SCHEMATA'
- SQL 注入漏洞(二)之 mysql 注入的相关知识
- vs使用中遇到的问题与插件
- 保密计算机和移动存储介质台账,银行计算机和移动存储介质保密管理办法
- 呼叫转移流程分析(一)
- 「解读苏宁」30年门店数字化发展心法与实践分享
- Redis学习之lpush命令
- 谷歌浏览器配置微信浏览器_微信网页版 - Chrome社交与通讯插件 - 画夹插件网
- 宾州汉语句法依存指南 树库(3.0) 中文整理版