在WebHttpRequest请求网页后,获取到的中文是乱码,类似这样:

<title>˹ŵ��Ϸ���������� - ��̳������ -  ˹ŵ��Ϸ����</title>

原因是网页多种编码方式(上述charset=gbk),UWP中Encoding能够支持UTF-8、Unicode,但是不支持gb2312、gbk等编码。

因此我们需要在获取流的时候对编码方式进行处理。

var reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"));  //UTF-8编码

网上搜到WP8下的解决方法,但是不能够直接用于UWP中,需要修改:

http://encoding4silverlight.codeplex.com/   下载

找到DBCD下的三个文件,将他们添加到解决方案中

1.DBCSEncoding.cs       2.Maps\big5.bin       3.gb2312.bin

【原方案:将两个.bin文件设置为嵌入的资源,将DBCSEncoding.cs设置为编译】

但你会发现:这条代码报错,意思是获取.bin文件的流:

Stream stream = typeof(DBCSEncoding).Assembly.GetManifestResourceStream(typeof(DBCSEncoding).Assembly.GetManifestResourceNames().Single(s => s.EndsWith("." + name + ".bin")))

是因为Type类型找不到Assembly属性;

于是想到用Application.GetResourceStream(uri)的方式取得.bin文件,但是UWP中没有了这个API了。

又查到如下:

http://msdn.microsoft.com/en-us/library/windows/apps/xaml/br229571.aspx 其中的Application object and app model 的最后一点:

Silverlight apps could either package application parts into the deployment package, as external parts, or download components on demand. A Metro style app has these choices too, but the APIs used to access the package parts are different. Where Silverlight uses Application.GetResourceStream, a Metro style app uses a more generalized model, where the installed package is just a storage folder. For example, you can call Package.InstalledLocation and then call a variety of StorageFolder APIs (most of which are async) in order to get any other packaged components.

意思是说Application.GetResourceStream的对应方式是通过Package.InstalledLocation 拿到安装目录,然后通过文件操作去读取资源。

所以就来看看如何操作:我把.bin放在另一个叫做DataHelperLib的Maps文件夹里。

当然你需要吧.bin的生成操作设置为内容,安装包里面才会出现

  public async static Task<Stream> GetInstall()

  {

    //此处只是简单的获取到gb2312.bin文件

    var folderInstall = Windows.ApplicationModel.Package.Current.InstalledLocation;  //获取安装包的位置

var folder = await folderInstall.GetFolderAsync("DataHelperLib");  //获取DataHelperLib文件夹

var mapFolder = await folder.GetFolderAsync("Maps");  //获取Maps文件夹

var file = await mapFolder.GetFileAsync("gb2312.bin");  //获取gb2312.bin

Stream stream = await file.OpenStreamForReadAsync();  //获取文件流

return stream;

  }

之后将DBCSEncoding.cs错误的那条代码替换成

  using(Stream stream = await StorageHelper.GetInstall());  //别忘了将方法的返回值改为Task<DBCSEncoding>

最后以这种编码方式读取流:

  using (var stream = response.GetResponseStream())
  {
    var reader = new StreamReader(stream, await DBCSEncoding.GetDBCSEncoding("GB2312"));
    string content = reader.ReadToEnd();
    //DoSomething with callback stream
    OnSuccess(content, response.StatusCode);
  }

【UWP】解析GB2312、GBK编码网页乱码问题的更多相关文章

  1. 【知识积累】爬虫之网页乱码解决方法(gb2312 -> utf-8)

    前言 今天在测试爬虫项目时,发现了一个很严肃的问题,当爬取的网页编码格式为gb2312时,按照一般的办法转化为utf-8编码时总是乱码,PS:爬取的所有网页无论何种编码格式,都转化为utf-8格式进行 ...

  2. C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码

    数据库编码为utf8,但是由于某些表的一些字段存储了emoji字符,表采用了utf8mb4编码,默认情况下在C++代码中读出的中文字段值都变成了乱码. 解决方法为,在进行数据库查询前,在C++中执行一 ...

  3. 【linux学习笔记】Sublime Text3支持GB2312和GBK编码以及中文输入法

    几天在ubuntu15.10下使用Sublime Text3发现中文乱码,以及不能使用中文输入法(搜狗输入法linux版)的问题,捣鼓了半天,终于完善了,下面po一下我的解决方案. 一.支持GB231 ...

  4. BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别

    汉语unicode编译方式,BIG5是繁体规范,GB是简体规范 GB是大陆使用的国标码,BIG5码,又叫大五码,是台湾使用的繁体码. BIG5编码, GB编码(GB2312, GBK, ...), U ...

  5. 各种字符编码方式详解及由来(ANSI,UNICODE,UTF-8,GB2312,GBK)

    一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's go! ...

  6. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换

    原文出自:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html 在很多论坛.网上经常有网友问" 为什么我使用 ...

  7. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“  ...

  8. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  9. C语言:GB2312编码和GBK编码,将中文存储到计算机

    计算机是一种改变世界的发明,很快就从美国传到了全球各地,得到了所有国家的认可,成为了一种不可替代的工具.计算机在广泛流行的过程中遇到的一个棘手问题就是字符编码,计算机是美国人发明的,它使用的是 ASC ...

随机推荐

  1. 关于docker在windows环境下运行的第一次体验

    关于docker在windows环境下执行的原理 1.1.           首先是Docker Quickstart启动,如果在虚拟机Oracle VM VirtualBox不存在default虚 ...

  2. win 7下建立FTP

    1.安装FTP服务 鼠标桌面右击个性化-卸载程序-打开或关闭windows功能 2.在IIS控制面板里添加FTP站点 下一步 下一步 鼠标右击 下一步 下一步 3.配置ftp站点 4.测试站点是否正常 ...

  3. Ubuntu15.04YouCompleteMe插件安装

    0x00. 简介 YouCompleteMe号称Vim的自动补全神器,YouCompleteMe: a code-completion engine for Vim,该项目在github的地址:You ...

  4. 文件上传命令rz和下载命令sz的安装

    上一节中,我们已经搭建好了linux环境,现在我们开始使用xshell工具,连接虚拟机. 一.xshell工具简介 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Mic ...

  5. jsp九大内置对象

    application例如用于计算网站访问量时可用到.

  6. MySQL 用户登录密码和远程登录权限问题

    1.mysql数据库,忘记root用户登录密码. 解决如下: a.重置密码 #/etc/init.d/mysqld stop #mysqld_safe --user=mysql --skip-gran ...

  7. canvas arcTo()用法详解

    CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...

  8. Git开发分支管理

    远程仓库有master和dev分支的情况 1. 克隆代码 git clone https://somewhere.com/master-dev.git 2. 查看所有分支 git branch --a ...

  9. PAT 1050. 螺旋矩阵(25)

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  10. PAT 1042. 字符统计(20)

    请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过1000的字符串.字符串由ASCII码表中任意可见字符及空格组成,至少包含1个英文字母,以回车结束( ...