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安全配置 如何配置使其更安全
Dec 16 PHP
解析php中的escape函数
Jun 29 PHP
php中url函数介绍及使用示例
Feb 13 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
简单实现php上传文件功能
Sep 21 PHP
PHP反射学习入门示例
Jun 14 PHP
laravel config文件配置全局变量的例子
Oct 13 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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版
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
JS下载文件|无刷新下载文件示例代码
2014/04/17 Javascript
JavaScript通过prototype给对象定义属性用法实例
2015/03/23 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
python基于http下载视频或音频
2018/06/20 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
python设置表格边框的具体方法
2020/07/17 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
音乐教学反思
2014/02/02 职场文书
工伤赔偿协议书范本
2014/04/15 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
市场营销计划书范文
2015/01/16 职场文书
党风廉正建设责任书
2015/01/29 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers