发布josn时遇到的编码问题小结
回家有5天了,在家的环境也许更安逸一些,没有那么多的事情牵绊着,可以玩玩游戏,看看片,和同学出去吃个饭,到网吧去玩上一下午。
这几天码的东西也不少,从回家第一天,就开始了写参赛的那个android应用。在服务器端发布json的时候遇到了两次编码的问题。在学校的时候,就把市场的list和detail信息发布为json了,当时遇到了一个编码的问题,因为数据库是gbk的,页面是gb2312的,而PHP的json_decode函数只认UTF-8编码,否则中文会出现无法被decode的情况,尝试了很多种方法,iconv貌似没有作用,最后在“简明现代魔法”上面找到了解决的方法,使用了他重新修改的json函数进行decode,总算正常了。
回家以后开始做图书馆图书查询模块,因为学校图书馆不给权限,所以只能采集了,幸而图书馆图书查询用的是标准的get方式,这样自己在服务器端接受手机端发送的get请求,然后由服务器端向图书馆的目标地址发送查询请求,再对请求到得页面内容进行解析,采集到需要的内容后存到一个数组里然后发布成json供手机端调用。在这里也遇到了一个编码的问题,因为有很多需要解析的内容并不是在html标签里面的,所以只能采到一段plaintext然后用explode进行分割,但是原来不在html标签里的内容在var_dump的时候却变成了html实体,中文空格什么的都成了html实体,很纠结,不清楚为什么同样的一段文本,一段正常一段不正常,后来仔细观察发现,原来不正常的那段文本原来都是有引号包起来的,试着使用htmlspecialchars却没有作用,仔细查手册才发现原来htmlspecialchars有三个参数,分别是string,quotestyle,character-set,而自己只使用了第一个参数,quotestyle使用的是默认的,所以悲剧了。ENT_QUOTES 这一个,编码双引号和单引号,而默认的ENT_COMPAT只编码双引号。还有第三个参数字符集,应该选择utf-8.
以前以为,只要页面编码、数据库编码和文件编码一致就可以解决乱码问题,现在看来,是自己对编码的理解太狭隘了,编码不仅仅是字符集编码,还有html实体编码,url编码,16进制编码,64位编码等等一大堆编码的相互转化问题,在解决问题中成长,此言非虚啊。自己对html的基础都不清楚,连htmlspecialchars有几个参数都不知道,如何出来混呢!