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中实现简单的ACL 完结篇
Sep 07 PHP
PHP __autoload函数(自动载入类文件)的使用方法
Feb 04 PHP
分享PHP header函数使用教程
Sep 05 PHP
php stream_get_meta_data返回值
Sep 29 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
深入浅出php socket编程
May 13 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
php结合ajax实现手机发红包的案例
Oct 13 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
Jul 04 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
php中yar框架实例用法讲解
Dec 27 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
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
PHP中ini_set和ini_get函数的用法小结
2014/02/18 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
JS代码格式化和语法着色V2
2006/10/14 Javascript
很可爱的输入框
2008/08/03 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
简单实现jQuery上传图片显示预览功能
2020/06/29 jQuery
express+mockjs实现模拟后台数据发送功能
2018/01/07 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
JavaScript实现随机五位数验证码
2019/09/27 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
[54:53]完美世界DOTA2联赛PWL S2 GXR vs PXG 第二场 11.18
2020/11/18 DOTA
python 调试冷知识(小结)
2019/11/11 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
Python爬虫之Selenium库的使用方法
2021/01/03 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
大学活动邀请函
2014/01/28 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
QT与javascript交互数据的实现
2021/05/26 Javascript
MySQL之select、distinct、limit的使用
2021/11/11 MySQL