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中显示格式化的用户输入
Oct 09 PHP
一个简单的PHP&amp;MYSQL留言板源码
Jul 19 PHP
PHP6 先修班 JSON实例代码
Aug 23 PHP
php 文件上传系统手记
Oct 26 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
php给图片添加文字水印方法汇总
Aug 27 PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
Oct 25 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 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实现的简单压缩英文字符串的代码
2008/04/24 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php实现短信发送代码
2015/07/05 PHP
php实现的PDO异常处理操作分析
2018/12/27 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
基于JQuery框架的AJAX实例代码
2009/11/03 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
2015/12/02 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
React优化子组件render的使用
2019/05/12 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
vue移动端的左右滑动事件详解
2020/06/17 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
pymongo中group by的操作方法教程
2019/03/22 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
工商管理专业应届生求职信
2013/11/04 职场文书
思想汇报范文
2013/11/04 职场文书
《母鸡》教学反思
2014/02/25 职场文书
劳资协议书范本
2014/04/23 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
MySQL触发器的使用
2021/05/24 MySQL