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 04 PHP
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
解析htaccess伪静态的规则
Jun 18 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
Nov 07 PHP
PHP截取指定图片大小的方法
Dec 10 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP创建PowerPoint2007文档的方法
Dec 10 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
基于PHP实现发微博动态代码实例
Dec 11 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 如何利用phpexcel导入数据库
2013/08/24 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
仿iframe效果Aajx文件上传实例
2016/11/18 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
在Python中处理XML的教程
2015/04/29 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
推荐值得学习的12款python-web开发框架
2020/08/10 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
医务人员自我评价
2014/01/26 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
乌鸦喝水教学反思
2014/02/07 职场文书
旷课检讨书1000字
2014/02/14 职场文书
永远是春天观后感
2015/06/12 职场文书
个人催款函范文
2015/06/24 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android