PHP微信开发学后小扩展:汉字在不同的编码环境中占不同字节

397 查看

对于一个仅仅临时过一遍PHP基础,临时看了thinkphp的框架原理,直接学习微信开发的小白来说,在学完了PHP微信开发的提升课程之后,对微信开发总算是能够自己开始摸索了,今天是在学会了使用第三方api在微信中进行天气查询的编码后自主的一些小扩展,想想还是写出来,增加点印象与理解。
渔夫老师给我们讲了个大概,怎么使用第三方api,是直接回复城市名称,然后进行查询,我在想,实际开发中,肯定不能是这样的,用户不可能直接回复一个城市的名称,然后我们就知道他要查询的是天气,肯定需要特定的格式,比如【城市+天气】这样。
嗯~对于一个小白来说,既然老师没告诉我该怎么办,那我就自己想想吧~
首先,假设我们已经告知用户,查询天气需要输入这样-》[城市+天气]的格式,然后我们根据他输入的格式将城市名称提取出来,然后再进行查询和回复。
我想,这里大概需要一个if判断,首先判断用户输入的是否包含‘天气’字符串,我其实并不知道php的这样的函数是什么,于是我百度了一下【php 判断是否包含字符串】,然后果然得到了答案,我决定使用strpos()函数,因为它返回的是一个boolean值,我需要的就是这个。
而其他的如strstr(),则是搜索字符串在另一字符串中的第一次出现,并返回字符串的剩余部分;
stristr(),与strstr()一样,区别是stristr()不区分大小写,而strstr()是分大小写的。
if判断为true后,我想,我需要从用户输入的Content中提取出城市的名称,该怎样实现呢,我觉得应该也是有这样的函数的,于是我又百度了一下【php 截取字符串的函数】,于是,我找到了substr(),他可以帮助我们截取字符串中制定位置的字符串,然而当我这样[substr($content,0,2)]进行城市名称截取的时候,我发现并没有什么卵用,然后我又学到了一个我觉得比较重要的小知识点:汉字在不同的编码环境中占不同的字节空间!
即:utf-8下一个汉字占用3个字节。linux系统默认情况下采用的该种编码方式。
gb2312下一个汉字占用2个字节。windows中文版采用的该种编码方式。
然后我试着这样-->【substr($content,0,6)】,于是实验成功,顺利跑通,见下图↓↓↓
图片描述

代码如下:

if (strtolower($msgType) == 'text') {
                $cityNamePos = '天气';
                if(strpos($content,$cityNamePos)){
                    $ch = curl_init();
                    $city = substr($content,0,6);
                    $url = 'http://apis.baidu.com/apistore/weatherservice/cityname?cityname='.urlencode($city);
                    $header = array(
                        'apikey: b57a13a33f5b10af4954e8d09e416489',
                    );
                    // 添加apikey到header
                    curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    // 执行HTTP请求
                    curl_setopt($ch , CURLOPT_URL , $url);
                    $res = curl_exec($ch);

                    var_dump(json_decode($res));
                    $arr = json_decode($res , true);
                    $content = '查询城市:'.$arr['retData']['city']."\n".
                               '查询日期:20'.$arr['retData']['date']."\n".
                               '当前天气:'.$arr['retData']['weather']."\n".
                               '当前气温:'.$arr['retData']['temp'].'℃';
                    $result = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                                </xml>";
                    $textInfo = sprintf($result,$fromUser , $toUser , $time , $msgType , $content);
                    echo $textInfo;
                }else{
                    $content = '查询天气请以[城市+天气]的格式输入,如[北京天气]';
                    $result = "<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                                </xml>";
                    $textInfo = sprintf($result,$fromUser , $toUser , $time , $msgType , $content);
                    echo $textInfo;
                }
            }
}