PHP正确解析UTF-8字符串技巧应用

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

(0)

相关推荐

  • php使用parse_url和parse_str解析URL

    PHP中有两个方法可以用来解析URL,分别是parse_url和parse_str. parse_url 解析 URL,返回其组成部分 mixed parse_url ( string $url [, int $component = -1 ] ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分. 本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分.不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析. 参数 url

  • PHP中可以自动分割查询字符的Parse_str函数使用示例

    直接上代码: 复制代码 代码如下: $str = "1&errid=1&fee=2&balance=2582&fails=&msgid=634541149212681528&msg=全部发送成功.";     parse_str($str, $output);     echo $output['msgid'];  //输出 634541149212681528 定义和用法 parse_str() 函数把查询字符串解析到变量中. 语法 p

  • php解析字符串里所有URL地址的方法

    本文实例讲述了php解析字符串里所有URL地址的方法.分享给大家供大家参考.具体如下: <?php // $html = the html on the page // $current_url = the full url that the html came from //(only needed for $repath) // $repath = converts ../ and / and // urls to full valid urls function pageLinks($ht

  • php解析http获取的json字符串变量总是空白null

    今天同事项目中遇到一个问题,通过http接口获取的json字符串使用json_decode始终无法正确解析,返回空白. 直接把结果字符串复制出来手动创建一个变量却正常,在前端js也能解析,搞了半天不得其解,借助强大的谷歌解决了问题,答案是接口吐出的结果包含有BOM头,BOM头这个东西可谓是php的死敌啊 不说了,直接上解决办法: 复制代码 代码如下: if (substr($return, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {     $retur

  • php使用parse_str实现查询字符串解析到变量中的方法

    本文实例讲述了php使用parse_str实现查询字符串解析到变量中的方法.分享给大家供大家参考,具体如下: parse_str()函数可实现把字符串解析到变量中,这意味着实现了字符串与变量之间的一种转换机制,在与客户端数据传递的过程中,数据是通过字符串的形式传递,如GET请求,然后在服务器端通过$_GET/$_POST等全局变量实现字符串与变量的转换,如:http://www.jb51.net/?index.php?var1=1&var2=2,请求后服务端可使用$_GET['var1']的方式

  • php一个解析字符串排列数组的方法

    本文实例讲述了php一个解析字符串排列数组的方法.分享给大家供大家参考.具体如下: <?php $str="1|苹果|30 1|桃子|50 1|普通|10 2|小麦|100 2|玉米|35 2|大米|30 3|电脑|5 3|MP3|121 3|打印机|8"; $strArray=explode("\n",$str); /*关键的是下面的代码*/ $result=array(); foreach($strArray as $item) { $itemArray=

  • php parse_str() 函数的定义和用法

    php parse_str() 函数把查询字符串解析到变量中,主要用于页面之间传值(参数).本文章向码农介绍php parse_str() 函数的使用方法,感兴趣的码农可以参考一下. 定义和用法 parse_str() 函数把查询字符串解析到变量中. 注释:如果未设置 array 参数,则由该函数设置的变量将覆盖已存在的同名变量. 注释:php.ini 文件中的 magic_quotes_gpc 设置影响该函数的输出.如果已启用,那么在 parse_str() 解析之前,变量会被 addslas

  • php遍历解析xml字符串的方法

    本文实例讲述了php遍历解析xml字符串的方法.分享给大家供大家参考,具体如下: <?php $content = <<<XML <?xml version="1.0" encoding="UTF-8"?> <test> <global_setting> <ping_protocol>HTTP</ping_protocol> <ping_port>80</ping_

  • PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)

    本文实例总结了PHP字符串处理技巧.分享给大家供大家参考,具体如下: Demo1.php <?php //源代码是文本形式,页面显示是 web 形式 $str = ' PHP '; //清理一下两边的空格 ltrim 只清理左,rtrim只清理右边 echo ltrim($str); echo '<br/>'; echo rtrim($str); echo '<br/>'; //两边都清理 echo trim($str); //echo chop($str); ?> D

  • 浅谈PHP解析URL函数parse_url和parse_str

    PHP中有两个方法可以用来解析URL,分别是parse_url和parse_str. parse_url 解析 URL,返回其组成部分 mixed parse_url ( string $url [, int $component = -1 ] ) 本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分. 本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分.不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析. 参数 url

  • 解析php获取字符串的编码格式的方法(函数)

    如果不清楚字符串的编码格式的话,就可以将这段字符这样检查:$encode = mb_detect_encoding($string, array("ASCII",'UTF-8′,"GB2312′,"GBK",'BIG5′)); echo $encode;这样就能知道它是什么编码的了.后续操作还可以为其转码:if ($encode == "UTF-8″){$string = iconv("UTF-8″,"GBK",$s

随机推荐