windows phone 7中文天气预报应用
wp7的应用还是太少了,中文应用更少。虽然有天气预报应用但是自己感觉并不好用,感觉这样的程序应该很简单,于是萌生了自己写一个的想法。
印证了群里朋友说的一句话:程序员往往都是使用别人的程序觉得这里不好那里不好,等到自己想做一个的时候才发现水很深。
整个过程真是几经波折。先在网上搜索一番,发现了Windows Phone 7 网络编程之天气预报应用,看到xml解析的时候就知难而退了,因为在学校的时候学习xml无果。于是这个想法在我的onenote里面待了很久,最近终于在工作上需要解析xml硬着头皮了解了一下,其实并不是那么难。于是开始动手做吧,先后又遇到了网络文件无法直接调用,xml文件读取出来是乱码等等问题,找了很多资料和文档,现在终于实现了。
接下来说下程序的编写过程:
我使用了LINQ to XML来解析xml文件,在加载xml的时候最开始文件路径我直接填写了http://www.google.com/ig/api?weather=guangzhou,报错信息大致是不能直接填写web网络路径。找了一下资料,HttpWebRequest相关的东西没看明白,使用WebClient来获取网络文件资源。这里参考了将网络资源写入WP7隔离存储空间
view sourceprint?1 string url = "http://www.google.com/ig/api?weather=guangzhou&hl=zh-cn";//&hl=zh-cn
2 WebClient wc = new WebClient();
3 Uri uri = new Uri(url);
4
5 wc.OpenReadAsync(uri, "api.xml");//第一种方法读取网络资源,打开流向指定资源的可读流
6 wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);//读取完成以后触发的事件
7
8 wc.DownloadStringAsync(uri, "api.xml");//第二种方法读取网络资源,将指定的字符串下载到指定的资源
9 wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);//读取完成后触发的事件
读取完成后触发事件的机制我并不了解,在这里绕了很久的弯。我将对天气对象的赋值操作写在读取完成的事件里面,而对程序页面上的TextBlock赋值显示的语句写在获取网络资源语句之后,实际的执行顺序是执行了获取资源语句以后并没有直接跳转到读取完成事件里面的语句(因此天气对象的值仍然是空的),直接执行了后面的TextBlock赋值语句,最后才跳转到读取完成的事件里面对天气对象赋值。结果程序运行显示的天气为空。这个事件还得详细了解。
解决这个问题以后程序能够顺利运行并从网络更新数据了
但是接着问题就来了:在电脑上访问http://www.google.com/ig/api?weather=guangzhou返回的xml文件是中文的,Windows Phone 7 网络编程之天气预报应用的作者也提到,在WP7中访问这个接口返回的xml文件是英文的,图中可以看到最高温度和最低温度都是华氏温度单位。评论中有人提到增加&hl=zh-cn以后返回的就是中文,我修改了程序中的相应地址以后,程序变成了这样:
中文部分全都变成了乱码!!!在网上搜索了一下找到了问题所在
返回的XML的头部,<?xml version="1.0" ?>,跟标准的XML头部相比缺少了类似encoding=UTF-8这样的编码声明。于是怀疑正是由于这一点导致SAX或者DOM解析器把本不是UTF-8的字符编码当作UTF-8来处理,于是导致了乱码和异常。经过google搜索证实当使用hl=zh-cn时返回的是GBK编码的XML,并且有许多用到这个API的php代码都做了GBK->UTF-8的转换处理。
问题到了这里其实就很简单了,既然是GBK编码SAX和DOM默认当UTF-8来处理,并且我们不可能去更改GOOGLE的Servlet让他返回一个在XML头部带encoding=GBK的XML。那么我们只有两个办法,要嘛就把返回的XML从GBK编码转码到UTF-8,要嘛就让SAX和DOM解析器把XML当GBK来处理。
- 发表评论
-
- 最新评论 更多>>