视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP正确解析UTF-8字符串技巧应用
2020-11-27 19:03:26 责编:小采
文档

在《学习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);

下载本文
显示全文
专题