request亂碼指的是:瀏覽器向服務器發送的請求參數中包含中文字符,服務器獲取到的請求參數的值是亂碼;
response亂碼指的是:服務器向瀏覽器發送的數據包含中文字符,瀏覽器中顯示的是亂碼;
亂碼產生的原因:
不管是request亂碼還是response亂碼,其實都是由於客戶端(瀏覽器)跟服務器端采用的編碼格式不一致造成的。
以request亂碼為例:
瀏覽器向服務器發送請求,因為瀏覽器與服務器之間的通信實質上是socket流,所以要先將請求參數(字符)轉換成字節,也就是編碼過程,服務器接收到請求參數后進行解碼(字節轉字符),然后封裝到request對象中。如果客戶端的編碼與服務器端的解碼不統一,就會導致通過request獲取到的請求參數的值是亂碼。
//GET請求
public static String HttpGetUrl(String url)
{
string strReturn = string.Empty;
String urlEsc = url;
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(urlEsc);
req.Method = "GET";
try
{
using (WebResponse wr = req.GetResponse())
{
Stream stream = wr.GetResponseStream();
byte[] buf = new byte[1024];
while (true)
{
int len = stream.Read(buf, 0, buf.Length);
if (len <= 0)//len <= 0 跳出循環
break;
strReturn += System.Text.Encoding.GetEncoding("utf-8").GetString(buf, 0, len);//指定編碼格式
}
}
}
catch (Exception ex)
{
throw ex;
}
return strReturn;
}
//POST請求
public static String HttpPostData(String url, String data)
{
string strReturn = string.Empty;
byte[] byteData = Encoding.UTF8.GetBytes(data); //在轉換字節時指定編碼格式
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = byteData.Length;
try
{
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(byteData, 0, byteData.Length);//發送數據
}
//get reponse data and parse
using (WebResponse response = httpWebReq.GetResponse())
{
using (WebResponse response = httpWebReq.GetResponse())
{
//解決亂碼:utf-8 + streamreader.readtoend
StreamReader reader = new StreamReader(response.GetResponseStream() , Encoding.GetEncoding("utf-8"));
strReturn = reader.ReadToEnd();
reader.Close();
reader.Dispose();
}
StreamReader reader = new StreamReader(response.GetResponseStream() , Encoding.GetEncoding("utf-8"));
strReturn = reader.ReadToEnd();
reader.Close();
reader.Dispose();
}
}
catch (Exception ex)
{
throw ex;
}
return strReturn;
}