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 Ubb代码编辑器函数代码
Jul 05 PHP
PHP递归调用的小技巧讲解
Feb 19 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
分享php邮件管理器源码
Jan 06 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
[原创]php实现 data url的图片生成与保存
Dec 04 PHP
详解Yii2.0 rules验证规则集合
Mar 21 PHP
PHP利用Cookie设置用户30分钟未操作自动退出功能
Jul 03 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
JS &amp; JQuery 动态添加 select option
2016/06/08 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python制作Windows系统服务
2017/03/25 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python numpy实现二维数组和一维数组拼接的方法
2018/06/05 Python
django反向解析和正向解析的方式
2018/06/05 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
用python进行视频剪辑
2020/11/02 Python
Java程序开发中如何应用线程
2016/03/03 面试题
动物学专业毕业生求职信
2013/10/11 职场文书
司机检讨书
2014/02/13 职场文书
小学生安全演讲稿
2014/04/25 职场文书
家长通知书家长意见
2014/12/30 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
详解Redis主从复制实践
2021/05/19 Redis
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
JavaScript文档对象模型DOM
2021/11/20 Javascript