PHP实现中文截取无乱码
字符串的处理是编程中比较常见的,各种编程语言对字符串的处理也提供了大量函数,像php中mb_substr()函数可以实现对中文字符串的截取,如何使用自定义方法实现中文字符串截取无乱码这也是面试经常遇到的一道题目,不要觉得这是多此一举,php内置函数已经实现了,为什么要自己实现.其实这道题的真实目的是考查你对字符编码的理解.最起码你要知道从哪里开始截取,截取几个字节才是一个完整的字符,不然截取到的都是乱码.这就需要你对多字节字符编码有一定的了解.下面一起来实现吧.
<?php
/**
* 中文截取无乱码
* 下面自定义一个函数实现中文截取无乱码,由于中文字符是多字节编码实现的,所以
* 在截取的时候不仅要知道从哪里开始截取还要知道截取几个字节,在这一点上utf-8
* 实现的比较好,这种编码可以通过最高位字节来区分该字符占几个字节的编码
*
* UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,由Ken Thompson于1992年创建。
*
* 通过查询相关资料可知:
* utf-8最高位字节与该字符所占字节数有以下对应关系
* 0xxx xxxx 占1字节
* 110x xxxx 占2字节
* 1110 xxxx 占3字节
* 一般三个字节能够表示所有汉字对应编码
*/
/**
* @param str $str 被截取的字符串
* @param int $length 需要截取长度,即需要截取的字符个数
*/
function mulsubstr($str,$length){
if($length<=0){ //截取字符为0或负数,返回空字符串
return '';
}
$offset=0; //截取每个字符时最高位字节的偏移量(位置),开始的时候截取第一个字符,该字符最高位字节位置为0
$chars=0; //已经截取到的字符,开始时为0
$returnstr=''; //截取后返回的字符串
while($chars<$length){ //只要已经截取到的字符没有达到需要截取的就继续截取
$highchar= decbin(ord(substr($str, $offset,1))); //得到每个字符最高位字节编码字符,根据该编码字符判断向后截取几个字节
if(strlen($highchar)<8){ //该字符占一个字节时,按照上面的规律,返回字符编码二进制为0xxx xxxx的字符串形式,转为二进制时开头的0会舍弃,该字节就只有7位了,
//若此处使用if(substr($highchar,0,2)=='01'),则该判断永远不会生效,因为在decbin时最高位字节为0会舍去,这样就可以使用最高位字节长度来判断了,这点需要重点理解。
$cutbyte=1;//
}else if(substr($highchar,0,3)== '110'){
$cutbyte=2;
}else if(substr($highchar, 0,4)== '1110'){
$cutbyte=3;
}else if(substr($highchar,0,5)=='11110'){
$cutbyte=4;
}
//判断完对应字符编码所占字节后开始截取并拼接
$returnstr.=substr($str,$offset,$cutbyte);
$chars+=1; //继续截取下一个字符
$offset+=$cutbyte; //下一个字符最高字节偏移量
}
return $returnstr; //返回需要截取的字符串
}
$STR='中华人民共和国hubei省武汉市';
echo mulsubstr($STR, 13); //中华人民共和国hubei省
PHP实现中文截取无乱码的更多相关文章
- php中文截取无乱码方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
- PHP实现中文字串截取无乱码的方法
直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: 1.使用mbstring扩展库的mb_substr截取就不会出现乱码了. ...
- PHP中实现中文字串截取无乱码的方法
[本文转自独占神林的日志:链接:http://yuninglovekefan.blog.sohu.com/176021361.html] 在PHP中,substr()函数截取带有中文字符串的话,可能会 ...
- php实现中文字符串无乱码截取
在PHP开发中会经常用到字符串截取,有的时候字符串截取会出现乱码的情况,那么怎么解决这个问题呢,其实也很容易 首先我们要了解关于中英文占多少字节的问题. ASCII码:一个中文汉字占两个字节的空间. ...
- PHP实现中文字符串截取无乱码
在我们学习PHP知识的过程中,PHP截取字符串应该是一个非常常见的字符串基础操作了,想必大家都比较熟悉这方面知识点. 但是有些新手朋友们可能遇到过,当截取中英文字符串时出现乱码的情况,其实这个也是非常 ...
- php截取中文字符串无乱码的方法
利用php内置方法mb_substr截取中文不乱码,使用起来非常简单 <?php $str = '我喜欢laravel or yii2'; echo mb_substr($str, 0, 1, ...
- php中英文截取无乱码 包括全角下的字符
符合UTF-8下,如果GBK下 改为 $content .= $str[$sing].$str[$sing+1]; $sing += 3; 改为 $sing += 2; /** ...
- PHP substr截取中文字符出现乱码的问题解疑
我们在使用PHP substr截取中文字符的时候,经常会出现乱码的情况,导致程序无法正常运行,这时怎么引起的呢?通过分析,我们知道,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: ...
- php截取字符串,无乱码
今天面试,有一道题,要求截取中文字符无乱码. 当时因为要赶去另一家去面试,没有仔细分析. 虽然现在供职的这家公司b2c项目正在用,因为当时赶项目,是网上拿来直接用的. 回来以后再重新整理了一下. 代码 ...
随机推荐
- 读取HttpWebResponse流的两种方法及注意的问题
1. 获取流 HttpWebRequest request= (HttpWebRequest)WebRequest.Create(uri); //构建http request request ...
- 在一个form里边同时执行搜索和 execl导出功能
一个form 分搜索 和 导出<form name="searchform" id="searchform" > <input type=&q ...
- tomcat设置http自动跳转为https访问
一.生成服务器端证书文件 可以使用Windows系统或者Linux系统 (1)Windows环境 条件:已经安装JDK 步骤: 1.在运行里输入cmd进入命令窗口 2.进入JDK安装目录 如D:/P ...
- java JDBC测试
下载mysql-connector-java-5.1.31.jar添加到工程buildpath中 package com.jdbc.test; import java.sql.DriverManage ...
- 关于jq的load不用回调获取其中dom元素方法
jq的load方法如果要操作其中的dom元素,需要使用回调,等其加载完了再进行dom元素的获取,今天看我们项目组长写的一段代码,发现不用回调也能获取到其中的元素. 具体是这样写的: <scrip ...
- php curl拉取远程图片
<?php $url = "图片绝对地址/thumbnail.jpg"; $filename = 'curl.jpg'; getImg($url, $filename); / ...
- ndk搭建与运行
1)打开Android开发者的官网http://developer.android.com/找到Develop点击.如果页面打不开,通过代理来访问. 2)进入后再点击Tools 3)进入后在左侧找到N ...
- ansible尝试
1.下载软件 http://releases.ansible.com/ansible/ 2.软件安装 [root@Yangjian-VM02-241 ansible-stable-2.0.0.1]# ...
- 4.请求方式为application/json时的接口测试要如何做?
1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...
- HDU-1757--A Simple Math Problem(矩阵乘法)
Problem Description Lele now is thinking about a simple function f(x).If x < 10 f(x) = x.If x > ...