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脚本的10个技巧(4)
Oct 09 PHP
通过文字传递创建的图形按钮
Oct 09 PHP
一些使用频率比较高的php函数
Oct 03 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
php数组去重实例及分析
Nov 26 PHP
PHP中的替代语法介绍
Jan 09 PHP
Yii多表联合查询操作详解
Jun 02 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP中抽象类,接口功能、定义方法示例
Feb 26 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开发负载均衡指南
2010/07/17 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
qpython3 读取安卓lastpass Cookies
2016/06/19 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
请写出char *p与"零值"比较的if语句
2014/09/24 面试题
毕业生怎样写好自荐信
2013/11/11 职场文书
企业厂长岗位职责
2013/12/17 职场文书
美食节策划方案
2014/05/26 职场文书
朋友聚会开场白
2015/06/01 职场文书
学会感恩主题班会
2015/08/12 职场文书
mysql优化
2021/04/06 MySQL
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
mybatis 获取更新记录的id
2022/05/20 Java/Android