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 相关文章推荐
ADODB类使用
Nov 25 PHP
动易数据转成dedecms的php程序
Apr 07 PHP
php查看session内容的函数
Aug 27 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
Jul 08 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
PHP性能优化大全(php.ini)
May 20 PHP
深入理解PHP原理之执行周期分析
Jun 01 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
PHP类的自动加载机制实现方法分析
Jan 10 PHP
PHP7 其他语言层面的修改
Mar 09 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
WordPress中&quot;无法将上传的文件移动至&quot;错误的解决方法
2015/07/01 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php与python实现的线程池多线程爬虫功能示例
2016/10/12 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
asp批量修改记录的代码
2008/06/25 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
JavaScript组合设计模式--改进引入案例分析
2020/05/23 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
python发布模块的步骤分享
2014/02/21 Python
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
大学四年学习的自我评价分享
2013/12/09 职场文书
大学三年的自我评价
2013/12/25 职场文书
介绍长城的导游词
2015/01/30 职场文书
导游词之桂林
2019/08/20 职场文书