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扩展编写点滴 技巧收集
Mar 09 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
PHP面向对象——访问修饰符介绍
Nov 08 PHP
如何用PHP实现插入排序?
Apr 10 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
PHP实现多文件上传的方法
Jul 08 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
Mar 07 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP+MySQL实现消息队列的方法分析
May 09 PHP
PDO::quote讲解
Jan 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
2013/08/29 Javascript
js实现图片和链接文字同步切换特效的方法
2015/02/20 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
javascript正则表达式之分组概念与用法实例
2016/06/16 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
python 利用turtle模块画出没有角的方格
2019/11/23 Python
PyQt5实现简单的计算器
2020/05/30 Python
基于tf.shape(tensor)和tensor.shape()的区别说明
2020/06/30 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
护士求职推荐信范文
2013/11/23 职场文书
运动会广播稿500字
2014/01/28 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
幼儿园开学通知
2015/04/24 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers