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隔离存储空间

?
1
2
3
4
5
6
7
8
9
string url = "http://www.google.com/ig/api?weather=guangzhou&hl=zh-cn";//&hl=zh-cn
WebClient wc = new WebClient();
Uri uri = new Uri(url);
wc.OpenReadAsync(uri, "api.xml");//第一种方法读取网络资源,打开流向指定资源的可读流
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);//读取完成以后触发的事件
wc.DownloadStringAsync(uri, "api.xml");//第二种方法读取网络资源,将指定的字符串下载到指定的资源
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来处理。

虽然是不同的平台,但也有相通的地方啊~~虽然找到了问题所在,但是解决方法可不那么简单了,搜索了很久都说wp7不支持GBK编码,找了几个转码的方法也运行不了,MSDN上说只支持utf8和utf16。就要放弃了,已经在考虑天气预报也就那几个数据,自己写个判断晴天多云的用中文显示算了。这时候群里的朋友给了一个类,能够让Silverlight支持GB2312中文编码!用上以后在调试的过程中终于能在VS里面看到string对象的内容变成中文了。

最后将包含中文xml信息的string对象传到xml解析方法的时候报出了'.', hexadecimal value 0x00, is an invalid character.错误,看来GBK支持类并不完美。于是继续寻找解决方法,原因是由于string包含有无效字符,已经是焦头烂额了。

找了几个方法都会将中文和无效字符一起去掉,并最后找到了一个C#去除xml无效字符的方法:

?
1
2
3
4
5
public string CleanInvalidXmlChars(string text)
{
    string re = @"[^\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF\u4e00-\u9fa5]";
    return System.Text.RegularExpressions.Regex.Replace(text, re, "");
}

最终成功传入中文xml数据,程序运行正常!

另外在调试程序的过程中偶尔不定时的会出现xml解析错误的情况,xml解析方法已经写好了本该不会出错,经过排查发现是google的问题,下面 的xml是我在同一时间获取的两个不同城市的数据,广州的xml文件一切正常,贵阳xml文件中框注的内容里conditong的data属性缺失了,相 应的icon的data属性也没了,因此解析出错。这个问题不定时的出现,现在仅仅是实现了中文读取,今后需要在程序中加入相应的错误检测代码,否则解析 出错程序就会自动退出了。

这次编写程序对我的影响很深刻,看似很简单的一个应用却引出了那么多的问题,水很深啊水很深。。。不过最后成功了,非常开心,也增强了我的自信,遇到困难需要自己动手去查去学不管能不能解决问题最终都是肯定能有所收获的。

转载于:https://www.cnblogs.com/songtzu/archive/2012/04/11/2442601.html

windows phone 7 中文天气预报应用--来源http://www.cnblogs.com/liulunet/archive/2011/08/17/2141696.html...相关推荐

  1. Android NDK 开发环境搭建(二)----来源http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.htm

    随笔- 116  文章- 0  评论- 106  android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) android 最新 N ...

  2. Windows SharePoint Services 中文网站模板

    适用于: Microsoft Office Excel 2003, Outlook 2003, PowerPoint 2003, Word 2003 这组中文网站模板基于 Microsoft Wind ...

  3. 说说 Windows 中的中文字体

    上一篇说了 Silverlight 中的中文字体,现在来说说 Windows 中的中文字体. 在默认情况下,也就是未自行安装新字体或者 Office 等文字处理软件的情况下,Windows 默认提供下 ...

  4. Windows 10 powershell 中文乱码解决方案

    Windows 10 powershell 中文乱码解决方案 参考文章: (1)Windows 10 powershell 中文乱码解决方案 (2)https://www.cnblogs.com/we ...

  5. windows下gvim中文乱码解决方案

    网罗了一些网上的解决windows下gvim中文乱码的解决方案,都试了一遍,可惜都不能完全解决我的所有问题,最后我综合一下网上的两种方案,得到了最后完全解决我的中文乱码问题的方案,配置很简单,就是把下 ...

  6. android端与windows端通信中文乱码问题

    首先,android端从windows端下载一段中文文字, public String downLoad(String urlStr){InputStream is = null;try{URL ur ...

  7. 微软开放Windows Phone 7中文开发中心

    Apple的App Store的成功,推动了中国移动互联网的发展,在中国移动应用开发大会时,众多业内知名公司和专家,纷纷表示2011年移动互联网将成为新一轮的焦点.而世界级的移动应用服务商也逐渐将目光 ...

  8. Windows Vista 官方中文正式版(MSDN)(转载)

    Windows Vista 官方中文正式版(MSDN) 国内BT下载:Windows Vista 官方中文正式版(MSDN) QUOTE: http://bt.hz0752.net/up/v64.to ...

  9. 解决qt5在windows系统下中文乱码的问题的简单方法

    解决qt5在windows系统下中文乱码的问题的简单方法 解决方法 以utf-8格式为代表进行修改. 首先,确定自己需要的文字编码格式,并在qt的项目-编辑器里面定义 接下来,选择出现乱码的文件里面的 ...

最新文章

  1. 旋转卡壳——模板(对踵点)
  2. 深度学习在高德的探索与实践
  3. Centos调出图形化的网络管理
  4. tf.dtypes.cast
  5. ESP32实验板linux环境中下载固件报错解决办法
  6. Apache RocketMQ在linux上的常用命令
  7. 什么代码才是线程安全的
  8. 【动态规划】01背包问题
  9. JS键盘事件最全keycode代码
  10. 如何使用JavaScript控制台:超越console.log()
  11. 未使用调试信息生成二进制文件_Visual Studio IDE 编译,调试 保存 使用
  12. a new weekday
  13. 均值滤波去除图像噪声的matlab程序
  14. 散列表,(拉链法,平方探测法,线性探测法)
  15. 计算机实用教学,【实用】计算机教学工作计划3篇
  16. Java中的BigDecimal,你真的会用吗?
  17. Android中切换Activity的动画
  18. 自编码器,变分自编码器和生成对抗网络异同
  19. Spring Boot 中使用 Hikari连接各类数据源
  20. 百家姓氏json数据

热门文章

  1. Command 传参的几种方式
  2. springBoot(20):使用Spring Session实现集群-redis
  3. js生成验证码并且验证
  4. 面试中关于Java你所需知道的的一切
  5. laravel项目中css样式表的背景图片不显示
  6. 内存不足 java.lang.OutOfMemoryError: Java heap space
  7. 2010软考软件设计师冲刺精选【专家压轴模拟•下】
  8. ASP.NET AJAX入门系列(10):Timer控件简单使用
  9. golang学习之旅(1)
  10. TDD开发模式实现代码功能逻辑(自己总结,持续更新)