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版(2)
Oct 09 PHP
PHP syntax error, unexpected $end 错误的一种原因及解决
Oct 25 PHP
php array_flip() 删除数组重复元素
Jan 14 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
php join函数应用
May 04 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
Jun 09 PHP
PHP修改session_id示例代码
Jan 08 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
Laravel 验证码认证学习记录小结
Dec 20 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php获取系统变量方法小结
2015/05/29 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
初识Node.js
2014/09/03 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
Python实现的弹球小游戏示例
2017/08/01 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
《乌塔》教学反思
2014/02/17 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
毕业生面试求职信
2014/06/23 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
用CSS3画一个爱心
2021/04/27 HTML / CSS
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js