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 快速生成 Flash 动画的方法
Mar 06 PHP
优化PHP代码的53条建议
Mar 27 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 PHP
php如何执行非缓冲查询API
Jul 22 PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
详解PHP队列的实现
Mar 14 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
Oct 08 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
生成sessionid和随机密码的例子
2006/10/09 PHP
10条PHP高级技巧[修正版]
2011/08/02 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php生成curl命令行的方法
2015/12/14 PHP
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
AngularJS模板加载用法详解
2016/11/04 Javascript
vue-hook-form使用详解
2017/04/07 Javascript
JS实现求5的阶乘示例
2019/01/21 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
python 实现单例模式的5种方法
2020/09/23 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
英国排名第一的停车场运营商:NCP
2019/08/26 全球购物
十一酒店活动方案
2014/02/20 职场文书
联谊会主持词
2014/03/26 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
群众路线四风自我剖析材料
2014/10/08 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS
MySQL 时间类型的选择
2021/06/05 MySQL
使用pandas生成/读取csv文件的方法实例
2021/07/09 Python