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 采集书并合成txt格式的实现代码
Mar 01 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
php实现的返回数据格式化类实例
Sep 22 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
PHP输出一个等腰三角形的方法
May 12 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
PHP大文件分块上传功能实例详解
Jul 22 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP实现的简单日历类
2014/11/29 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
基于JQuery实现仿网易邮箱全屏动感滚动插件fullPage
2015/09/20 Javascript
nodejs连接mysql数据库简单封装示例-mysql模块
2017/04/10 NodeJs
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
js中DOM事件绑定分析
2018/03/18 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
js类的继承定义与用法分析
2019/06/21 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
python线程、进程和协程详解
2016/07/19 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
python中类与对象之间的关系详解
2020/12/16 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
医校毕业生自我鉴定
2014/01/25 职场文书
委托公证书范本
2014/04/03 职场文书
小学生操行评语
2014/04/22 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
详解非极大值抑制算法之Python实现
2021/06/28 Python