Web乱码解决方法

最近被乱码折腾的够呛,现在工作告一段落,出来总结一下Web中传递数据乱码的情况,希望同样被乱码困扰的朋友能够安心入睡!

Web数据提交有两种方法:GET 和 POST。关于这两种方法的介绍,请看这里:Http之Get/Post请求区别。我在这里要介绍的是如何在程序中获取HTTPRequest数据,并成功解决编码不同时所引起乱码的问题。

现在我们开始,先看一段HTML代码:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
    <form id="myForm" action="http://localhost:9000/WebForm1.aspx" method="post">
        名称:<input tyep="text" name="name" width="200px" value="独钓寒江"/>
        <br />
        年龄:<input tyep="text" name="age" width="200px" value="24"/>
        <br />
        <br />
        <input type="submit" value="提交" />
    </form>
</body>
</html>

在这个HTML文件中,我们使用的编码是GB2312,Form表单中包含name和age两个数据。首先将method设置为GET方法:

 

<form id="myForm" action="http://localhost:9000/WebForm1.aspx" method="GET"> 

 

另外我们再新建一个Web应用程序,并在本地新建一个站点,将端口设置为9000,添加一个页面,名称为WebForm1.aspx,也就是上面Form表单中的action所指向的地址http://localhost:9000/WebForm1.aspx

在点击“提交”按钮的时候,我们可以在WebForm1中获取到网页的参数,具体有如下几种方式:

 

Request["name"]
Request.Params["name"]
Request.QueryString["name"]

 

这三种方法得到的字符串都是经过默认编码转换的,因为我们使用vs建立项目时编码默认为UTF-8,所以这时便会出现乱码。这是第一种问题,稍候我们将解决这个问题。

接下来将method设置为POST方法:

 

<form id="myForm" action="http://localhost:9000/WebForm1.aspx" method="POST">

 

在点击“提交”按钮的时候,我们可以在WebForm1中获取到网页的参数,具体有如下几种方式:

 

Request["name"]
Request.Params["name"]
Request.Form["name"]

 

和第一种问题相同,经过默认的UTF-8转换,这里还会出现乱码。这是第二种问题。

问题一的解决方法:

 

StringBuilder sb = new StringBuilder();
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
HttpWorkerRequest worker = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));
byte[] bs = worker.GetQueryStringRawBytes();
String queryString = Encoding.GetEncoding("GB2312").GetString(bs);
NameValueCollection querys = HttpUtility.ParseQueryString(queryString, Encoding.GetEncoding("GB2312"));

foreach (var item in querys.Keys)
{
    sb.AppendFormat("{0}:{1}<br />", item.ToString(), querys[item.ToString()]);
}

 

问题二的解决方法:

// 获取到InputStream
System.IO.Stream str = Request.InputStream;
Int32 strLen, strRead;
strLen = Convert.ToInt32(str.Length);
byte[] strArr = new byte[strLen];
strRead = str.Read(strArr, 0, strLen);
            
string queryString = HttpUtility.UrlDecode(strArr, System.Text.Encoding.GetEncoding("GB2312"));

NameValueCollection querys = HttpUtility.ParseQueryString(queryString, Encoding.GetEncoding("GB2312"));

foreach (var item in querys.Keys)
{
    sb.AppendFormat("{0}:{1}<br />", item.ToString(), querys[item.ToString()]);
}

 

另外,对于第一种方法,还可以直接将URL用GB2312解码,这里不再贴出代码。

有了这两种方法,不管是怎样的乱码,都可以高枕无忧了。 

 

 

 

如果认为此文对您有帮助,别忘了支持一下哦!

作者:齐飞

来源:http://youring2.cnblogs.com/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

转载:http://www.cnblogs.com/youring2/archive/2011/03/24/1993717.html

时间: 2024-11-04 18:09:40

Web乱码解决方法的相关文章

ASP.NET中Request接收参数乱码解决方法

asp教程.net中request接收参数乱码解决方法 asp.net教程 request对象的属性和方法比较多,常用的几个为:useragent 传回客户端浏览器的版本信息,userhostaddress 传回远方客户端机器的主机ip 地址,userhostname 传回远方客户端机器的dns 名称,physicalapplicationpath 传回目前请求网页在server 端的真实路径. 下面进行正题,我的web.config配置文件里配置了全局为"gb2312"编码: <

asp.net url址址中中文汉字参数传递乱码解决方法

中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下. 在cs文件里传参的时候用UrlEncode: Response.Redirect("B.asp教程x?Name="+Server.UrlEncode(Name)); 接参的时候用UrlDecode: Response.Write(Server.UrlDecode(Request.QueryString["Name"])); 脚本儿里传参的时候用

EF之数据库连接问题与中文乱码解决方法

ef之数据库教程连接问题与中文乱码解决方法 the specified named connection is either not found in the configuration, not intended to be used with the ent 1.首先修改<add name="northwindentities"        connectionstring="metadata=res://*/northwind.csdl|res://*/nort

asp.net乱码解决方法

asp.net乱码解决方法 在Web.comfig中配置 是一样的: <globalization requestEncoding="gb2312" responseEncoding="gb2312"/> 页面Header部分也都有 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 真是奇怪, 只好用了笨办法:

php excel reader2.21导出excel中文乱码解决方法说明

之前我的PHP教程博客访友询问使用php excel reader2.21导出excel时中文出现乱码如何解决,现我说明下php excel reader导出excel中文乱码的解决方法,希望对使用php excel reader导出excel的朋友有所帮助. php excel reader介绍 php excel reader是一个读取Excel xsl文件内容的一个php excel类,目前最新版本是php excel reader2.21,网上可自行搜索,sourceforge上的php

php读取der格式证书乱码解决方法

  这篇文章主要介绍了php读取der格式证书乱码解决方法的相关资料,需要的朋友可以参考下 遇到的问题: 我的项目需要用到应用der格式的证书公钥及RSA算法来验签相关签名,PHP关于RSA算法不是很懂,手头上有Java和.net两种语言的实现,PHP实现甚感吃力. 小伙伴们的解答: 这个证书有他自己相应的编码,首先要找到这个,然后在用php读,设置对应的编码就好了.另外你如果是直接echo出证书内容的话,在那之前最好用 标签编码一下,否则他其实没乱码,只是你浏览器无法识别而已.还要注意你php

thinkphp3查询mssql数据库乱码解决方法

 这篇文章主要介绍了thinkphp3查询mssql数据库乱码解决方法,需要的朋友可以参考下 thinkphp查询mssql数据库出现乱码的原因是ThinkPHP默认为UTF-8,而msmsql数据库是简体中文版,存储的是GB2312编码   解决方法:   1:在ThinkPHPLibCore 打开Db.class.php,在其最后面加上 2:在Db.class.php找到function select(),在$result = $this->query($sql);后面加一条 $result

win7打开记事本出现乱码解决方法汇总

  win7打开记事本出现乱码解决方法汇总.造成记事本打不开的原因有很多.其中包括你电脑的字体库不充分,通过记事本打开及保存的编码不正确,软件故障以及兼容性的问题.也有可能不是而被软件或者人为改动了等情况.所以要根据具体情况来分析记事本打开出现乱码的故障. 解决方法: 1.最简单的方法就是将你的txt文档的后缀名改掉,要看你改成原作者所编辑的格式,比如你原先是word文档格式,保存的时候保存的是txt格式,这 样只能尝试改回doc格式,然后在用word打开即可,查看能不能显示正常.这种情况的解决

Apache的基本设置和乱码解决方法

Apache的基本设置和乱码解决方法 一.Apache基本设置 1.Apache的核心配置文件名是"httpd.conf",其所存放的路径为"X:Apache2conf"目录下.用记事本打开它后,对它进行修改后再保存便可达到配置Apache服务器的目的. 2.由于配置文件"httpd.conf"决定着整个Apahce服务器的使用,因此对于它的修改千万要小心!强烈建议先做好多个备份,以防出错!如果实在忘了备份了,系统还为你准备了个名为"h