PHP正确解析UTF-8字符串技巧应用


Posted in PHP onNovember 07, 2012

在《学习PHP&MYSQL之——字符编码篇(一)》中介绍了Unicode与UTF-8的转换关系,总结了一个UTF-8的编码规则,根据这个编码规则,写一个UTF-8编码的解析程序,以下是PHP的实现:

<?php 
/* 
程序功能,$str是中英文混合的UTF-8编码字符串, 
将此字符串根据UTF-8的编码规则正确的解码并显示。 
*/ 
$str = '今天非常Happy,所有决定去KFC吃可乐鸡翅!!!'; 
/* 
$str 是待截取的字符串 
$len 是截取的字符数 
*/ 
function utf8sub($str,$len) { 
if($len <= 0){ 
return ''; 
} 
$offset = 0; // 截取高位字节时的偏移量 
$chars = 0; // 截取到的字符数 
$res = ''; // 存放截取的结果字符串 
while($chars < $len){ 
// 先取字符串的第一个字节 
// 将它转为十进制 
// 再转为二进制 
$high = ord(substr($str,$offset,1)); 
// echo '$high='. $high .'<br />'; 
if($high == null ){ // 如果取出高位为null,证明已经取到末尾,直接break 
break; 
} 
if(($high>>2) === 0x3F){ // 将高位右移2位,和二进制111111比较,相同则取6个字节 
// 截取2个字节 
$count = 6; 
}else if(($high>>3) === 0x1F){ // 将高位右移2位,和二进制11111比较,相同则取5个字节 
// 截取3个字节 
$count = 5; 
}else if(($high>>4) === 0xF){ // 将高位右移2位,和二进制1111比较,相同则取4个字节 
// 截取4个字节 
$count = 4; 
}else if(($high>>5) === 0x7){ // 将高位右移2位,和二进制111比较,相同则取3个字节 
// 截取5个字节 
$count = 3; 
}else if(($high>>6) === 0x3){ // 将高位右移2位,和二进制11比较,相同则取2个字节 
// 截取6个字节 
$count = 2; 
}else if(($high>>7) === 0x0){ // 将高位右移2位,和二进制0比较,相同则取1个字节 
$count = 1; 
} 
// echo '$count='.$count.'<br />'; 
$res .= substr($str,$offset,$count); // 取出一个字符与$res字符串连接 
$chars += 1; // 截取到的字符数+1 
$offset += $count; // 截取高位偏移量向后移$count字节 
} 
return $res; 
} 
echo utf8sub($str,100);
PHP 相关文章推荐
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php浏览历史记录的方法
Mar 10 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
PHP整合七牛实现上传文件
Jul 03 PHP
php开发工具有哪五款
Nov 09 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
PHP 记录访客的浏览信息方法
Jan 29 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
Apr 04 PHP
详解phpstorm2020最新破解方法
Sep 17 PHP
nginx+php-fpm配置文件的组织结构介绍
Nov 07 #PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 #PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 #PHP
php动态实现表格跨行跨列实现代码
Nov 06 #PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 #PHP
php语言流程控制中的主动与被动
Nov 05 #PHP
PHP编码转换
Nov 05 #PHP
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
php中in_array函数用法探究
2014/11/25 PHP
WordPress中创建用户角色的相关PHP函数使用详解
2015/12/25 PHP
PHP的全局错误处理详解
2016/04/25 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
2013/12/31 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
Angular.JS实现无限级的联动菜单(使用demo)
2017/02/08 Javascript
解决node修改后需频繁手动重启的问题
2018/05/13 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python实现网站表单提交和模板
2019/01/15 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
浅谈react路由传参的几种方式
2021/03/23 Javascript
医药工作者的求职信范文
2013/09/21 职场文书
历史系自荐信范文
2013/12/24 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书