记得有一个项目获取json数据。
使用浏览器获取是乱码,采用 UTF-8 编码则正常,则使用HttpWebRequest进行请求,采用了以下二种方式都无法进行正常编码
string sRet = "";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
//第一种方式
byte[] buf = new byte[1024];
while (true)
{
int len = stream.Read(buf, 0, buf.Length);
if (len <= 0)
break;
sRet += System.Text.Encoding.GetEncoding("UTF-8").GetString(buf, 0, len);
}
//第二种方式
if (stream != null)
{
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader read = new StreamReader(stream, encode);
return read.ReadToEnd();
}
以为完美收工,一经测试,还是乱码。
奇怪了,怎么一直乱码,不科学啊,经过查看 response的header,发现了返回的数据是采用gzip压缩的方式。
难怪以上二种常用的方式都是乱码,因为我们是对 gzip 压缩后的进行编码,所以要先解压再转码。
改进 StreaReader 读取数据流的方式。
StreamReader read = new StreamReader(new GZipStream(stream,CompressionMode.Decompress), encode);
要对读取到数据流进行解压。