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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
深入了解php4(2)--重访过去
Oct 09 PHP
基于mysql的bbs设计(一)
Oct 09 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
PHP实现简单登录界面
Oct 23 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 PHP
php解析非标准json、非规范json的方式实例
May 10 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
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
IE8的JavaScript点击事件(onclick)不兼容的解决方法
2013/11/22 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
jquery根据name取得select选中的值实例(超简单)
2018/01/25 jQuery
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
[02:13] 完美世界DOTA2联赛PWL DAY5集锦
2020/11/03 DOTA
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python 3.5下xadmin的使用及修复源码bug
2017/05/10 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
运用PyTorch动手搭建一个共享单车预测器
2019/08/06 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
Conforama瑞士:家具、厨房、电器、装饰
2020/09/06 全球购物
企划经理的岗位职责
2013/11/17 职场文书
应用艺术专业个人的自我评价
2014/01/03 职场文书
运动会通讯稿200字
2014/02/16 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
大学生交通专业求职信
2014/09/01 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server