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面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
Oct 11 PHP
php统计文件大小,以GB、MB、KB、B输出
May 29 PHP
基于Zookeeper的使用详解
May 02 PHP
php实现cc攻击防御和防止快速刷新页面示例
Feb 13 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
PHP缓存机制Output Control详解
Jul 14 PHP
dedecms中使用php语句指南
Nov 13 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
微信自定义菜单的创建/查询/取消php示例代码
Aug 05 PHP
PHPStrom 新建FTP项目以及在线操作教程
Oct 16 PHP
php文件上传原理与实现方法详解
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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
PHP解密Unicode及Escape加密字符串
2015/05/17 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
『jQuery』.html(),.text()和.val()的概述及使用
2013/04/22 Javascript
JavaScript实现多种排序算法
2016/02/24 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
Python内置数据类型详解
2014/08/18 Python
Python编程入门的一些基本知识
2015/05/13 Python
Python环境变量设置方法
2016/08/28 Python
python实现简易动态时钟
2018/11/19 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python文件路径名的操作方法
2019/10/30 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
英国床垫在线:Mattress Online
2016/12/07 全球购物
干部行政关系介绍信
2014/01/17 职场文书
模具专业自荐信
2014/05/29 职场文书
2014年银行个人工作总结
2014/12/05 职场文书
2015年班组工作总结
2015/04/20 职场文书
公司员工奖惩制度
2015/08/04 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
2021/06/11 Python
详解如何使用Nginx解决跨域问题
2022/05/06 Servers