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 相关文章推荐
仿Aspnetpager的一个PHP分页类代码 附源码下载
Oct 08 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
php中magic_quotes_gpc对unserialize的影响分析
Dec 16 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
php实现的一个简单json rpc框架实例
Mar 30 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP微信网页授权的配置文件操作分析
May 29 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
php启用zlib压缩文件的配置方法
2013/06/12 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
PHP时间和日期函数详解
2015/05/08 PHP
织梦sitemap地图实时推送给百度的教程
2015/08/03 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
javascript+css3开发打气球小游戏完整代码
2017/11/28 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
详细讲解Python中的文件I/O操作
2015/05/24 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
手把手教你python实现SVM算法
2017/12/27 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】
2019/03/18 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Python自动化测试中yaml文件读取操作
2020/08/20 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
检测浏览器对HTML5和CSS3支持度的方法
2015/06/25 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
英国在线房屋中介网站:Yopa
2018/01/09 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
商场中秋节活动方案
2014/02/07 职场文书
公司副总经理任命书
2014/06/05 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers