宝哥软件园

解决ASP中各种乱码问题的总结 网

编辑:宝哥软件园 来源:互联网 时间:2021-09-06

我经常发现有人被乱码困扰,但我觉得很幸运,很少担心。

在这个博客中,我会总结一些我想到的与乱码词相关的经验,供大家参考。

页面显示混乱问题

在网站中,有些页面会正常显示,但有些页面会显示为乱码字符。如果发生这种情况,您可以检查web.config和文件编码。

如果web.config是这样配置的:

全球化文件编码=' UTF-8 '/并且文件的编码不是UTF-8:

那么就会出现乱码问题。

注意:相反,会出现乱码字符。

1.不要设置文件编码,此时不会出现乱码字符。

2.fileEncoding='gb2312 ',文件以utf-8编码,此时不会出现乱码字符。

因此,我建议最好将所有文件都保存为UTF-8编码,以解决这种乱码问题。

AJAX提交中的数据被篡改

AJAX技术已经流行了这么多年,我认为现在很少有网站不使用这项技术。然而,有些人在使用AJAX时会遇到乱码。

通过分析这样乱码的案例,我发现几乎所有的都是这样向服务器提交数据的:“key 1=”escape(值1)“key 2=”escape(值2)

在大多数情况下,这种方法可以正常工作,但遇到一些特殊字符时就不起作用了。我稍后会解释原因。

我为这种不正确的方法准备了一个示例(为了保持示例简单,我演示了一个串联URL)。

页面代码如下:

pa id=' link 2 ' href=' # ' target=' _ blank ' escape/a/pscript type=' text/JAVAScript ' var str=' aa=1bb=' escape(' fish Li就是我'))‘cc=’逸(‘明朝1368年’);$('#link2 ')。attr('href ','/test_url_decode.ashx?method=escape ' str);/script服务器代码是从QueryString中读取这些参数值并输出它们。因为代码太简单,就不贴了。(可下载的示例代码)

当我单击链接时,服务器会返回以下结果:

注:中间的加号“鱼里是我。”不见了。

解决这个问题的一个简单方法是使用$。JQuery的param()方法。修改后的代码如下:

脚本类型=' text/JavaScript ' var my object={ aa : 1,bb: '鱼里是我',cc: '明朝1368 ' };$('#link1 ')。attr('href ','/test_url_decode.ashx?method=param' $。param(my object));/script另外,我非常反感拼接这个提交的数据:“key 1=”escape(值1)“key 2=”escape(值2)

因为这段代码的可读性太差,所以我建议在AJAX调用时,最好直接使用$。JQuery的ajax方法向服务器提交数据。

请看下面的示例代码(注意我给数据属性赋值的方式):

pa id=' btnTestParam ' href=' JavaScript : void(0);'点击我![点击我]/a/pdiv id=' div result'/div脚本类型=' text/JavaScript ' $(function(){ $(' # btntestparam ')。单击(function () {$)。Ajax ({url3360'/TestParam.ashx ',type: 'GET ',cache: false,data: { id: 2,name: 'fish li is me '。电话: '[emailprotected]#$%^*()_-=?| ',' x?x!' Xx': 'aa=2bb=3cc=汉字',//特殊键名和值内容也是特殊的。编码: '去死吧。)',中文键名: '明朝1368'},成功:函数(responsetext) {$ ('# divresult ')。html(response text);} });});});/脚本运行结果:

JavaScript中正确的网址编码

看完前面的例子,你有没有想过:为什么JQuery能解决逃避解决不了的问题?

对于这个问题,我想先看一下MSDN对逃跑的描述(截图):

MSDN说得很清楚,我不需要再解释了。

但是,我想有人可能会问:我是通过POST提交数据的吗?这不需要通过网址。

是的,在发布数据时,参数没有放在网址中,但仍然采用网址编码。

POST数据也是通过URL编码的,因为表单可以通过GET提交,然后数据会通过URL提交给服务器。

因此,提交的数据必须通过网址编码。

让我们来看看美元。ajax处理数据提交过程:

ajax:函数(OrigSettings){ var s=jquery . extend(true,{},jQuery.ajaxSettings,OrigSettings);//..删除一些不相关的代码//如果不是字符串,则转换数据如果(s.data s.process数据类型为s.data!=='string') {//注意下面的调用s.data=jquery.param (s.data,s .繁体);}我们来看看jQuery.param的实现过程:

//将表单元素数组或一组//键/值序列化为查询stringparam:函数(a,繁体){ var s=[];//..移除一些不相关的代码//如果传入了一个数组,假设它是一个表单元素的数组。if(jquery . isarray(a)| | a . jquery){//序列化表单元素jQuery.each(a,function() { add(this.name,this . value);});} else {//..移除一些非键代码}//返回结果序列化返回s. join(“”)。替换(r20 ' ');函数add(key,value ) { //如果value是函数,则调用它并返回它的值value=jQuery.isFunction(value)?value() :值;s[s . length]=encodeURIComponent(key)'=' encodeURIComponent(value);}}这段代码的核心是add函数的实现,它在内部调用encodeURIComponent()函数。

我们要注意JQuery如何处理数据:encodeuri组件(key)'=' encodeuri组件(value);

最后,JQuery还用一个数字代替了返回。

在WEB开发领域,我想你不应该怀疑JQuery的权威性。所以我觉得JQuery的方法绝对是正确的。

从JQuery的实现可以看出,编码URL数据实际上不建议使用encodeURI()。

说到这里,我想谈谈为什么不推荐encodeURI。

如果参数值本身包含一些特殊字符,EncodeURI用于编码整个URL字符串。

示例:key='x?' X/xx ',值='aa=2bb=3cc=汉字'该函数的结果将是不正确的。

通常在编码URL路径包含类似汉字时使用,不适合处理URL参数。

但是,我们可以在URL路径中选择英文字符作为目录名和文件名,所以encodeURI通常没有机会使用它。

ASP中正确的网址编码方法。网

我在JavaScript中介绍了三种URL编码方法。在服务器端,ASP.NET有更多的网址编码方法。今天我也对服务器端的编码做了一个总结,因为我发现网上的一些信息也是错误的。

ASP中有三种URL编码方法。NET:Httputity。UrlPathEncode,HttpUtility。网址编码和服务器。UrlEncode。NET框架还提供了系统类。Uri,它也有一些处理URL的方法。例如,有两种方法可以用于对网址路径和参数进行编码,即擒纵字符串和擒纵数据字符串。

面对这些方法,我该选择哪一种?

我建议HttpUtility。在ASP.NET对查询参数进行编码时应选择UrlEncode(str),拼接URL时应采用httputability . UrlEncode(key)'=' httputability . UrlEncode(value)的方法。使用HttpUtility。如果你想在网址中编码路径

让我解释一下之前不推荐其他方法的原因:

1.server.urlencode:的方法实际上调用了HttpUtility。UrlEncode,但它将尝试使用Response表示的编码格式。ContentEncoding然而,HttpUtility。UrlEncode(str)总是使用UTF-8编码。如果不想被字符编码纠缠,应该放弃Server。毕竟,UTF 8编码是一个更好的选择。

2.虽然系统的两种编码方式。Uri也可以实现我们需要的网址编码任务,当ASP.NET填写请求。查询字符串和请求。表单,使用的解码方式是HttpUtility.UrlDecode,所以如果坚持选择与System相关的编码方式。Uri,显然不可能匹配解码方法,后果很难说。

正确的网址编码方法概述

因为编码函数(方法)很多,很重要,我觉得有必要做个总结。

一个完整的URL可以简单地认为包含两部分:文件路径(包括目录)和QueryString,在编码时必须分别对待。

编码deuri,HttpUtility。对文件路径进行编码时,应选择UrlPathEncode。

在对查询参数进行编码时,我们应该选择encodeURIComponent,HttpUtility。UrlEncode,拼接方式应为:Encode(key) '=' Encode(value)

在考虑选择哪种编码方式之前,千万不要拼接整个URL(包括查询参数)。

还是那句话:在JavaScript中使用转义绝对是错误的。

彻底解决encodeURIComponent()和GB2312乱码问题

之前,我建议在JavaScript中使用encodeURIComponent()来处理提交的数据。但是,编码字符时,encodeURIComponent()使用UTF-8编码。因为这个原因,可能有人会说:我的网站使用的编码方式是gb2312!

全球化请求编码=' gb2312 '响应编码=' GB 2312 '/有时候我真的不想谈这个答案:不能把网站的编码改成UTF-8吗?

现在,我设计了一种方法来解决在GB1212编码的网站中使用encodeURIComponent()的问题。这种方法的设计思路很简单:既然encodeURIComponent()是由UTF-8编码的,那么我们是不是应该直接告诉服务器,客户端提交的数据是由UTF-8编码的?此时,服务器只需要根据UTF-8进行识别和解码。

理清思路,代码其实很简单。首先,看看客户端代码。

$.ajax({ //注意下面一行代码,它在send:函数(xhr) {xhr)之前添加了一个自定义请求头。setrequestheader ('x-charset ',' utf-8 ')到请求;},url: '/TestParam.ashx ',type: 'GET ',cache: false,data: { id: 2,name: 'fish li is me '。电话: '[emailprotected]#$%^*()_-=?| ',' x?x!' Xx': 'aa=2bb=3cc=汉字',//特殊键名和值内容也是特殊的。编码: '去死吧。)',中文键名: '明朝1368'},成功:函数(responsetext) {$ ('# divresult ')。html(response text);}});注意:在原来的基础上,我只加了一行代码:

beforeSend:函数(xhr){ xhr . setrequestheader(' x-charset ',' utf-8 ');},然后查看服务器代码。我编写了一个HttpModule来统一处理这个问题。

公共类ContentEncodingModule : ihttpmmodule { public void Init(HttpApplication app){ app。begin request=new event handler(app _ begin request);} void app_BeginRequest(对象发送方,event args e){ HttpApplication app=(HttpApplication)发送方;HttpWorkerRequest请求=(((IServiceProvider)app)。上下文)。GetService(type of(Httpworkerrequest))作为Httpworkerrequest);//注意:我没有使用app . request . headers[' x-charset ']//因为:大多数程序都不访问它,所以它会一直保持null。//如果此时问这个集合,会导致填充。//我认为填充Headers集合的成本比我接下来的调用要高得多。//因此,直接通过HttpWorkerRequest读取请求头的性能损失最小。字符串字符集=请求。getunknownequestheader(' x-charset ');If(字符串。compare (charset,' utf-8 ',stringcomparison。ordinaligorcase)==0)//当ASP.NET填写查询字符串时,表单,将访问请求。ContentEncoding作为字符编码app . request . content encoding=system . text . encoding . utf8;}转换的结果是,除非客户端显式添加‘x-charset’请求头,否则仍然会以原来的方式处理,服务器代码根本不需要修改。

描述:

1.如果所有网站都是JQuery提交的,可以统一设置,这是JQuery支持的功能。

2.如果使用JQuery1.5版本1.5或更高版本,它也可以写成:header : { ' x-charset ' : ' utf-8 ' }

3.即使网站将来使用UTF-8编码,所有代码也不需要修改。

Cookie乱码问题

前段时间有人在博客评论里问我:asked服务器写中文cookie,js,但是JS客户端读的时候乱码。

其实这个问题相对容易解决。方法是:写Cookie时,使用HttpUtility。UrlEncode进行编码,然后使用decodeURIComponent将内容传输回客户端。在这里,我推荐使用jquery.cookie.js作为读写cookie的插件。示例代码如下(前端):

$(function() { var cookie=$。cookie(' TestJsRead ');$('#cookieValue ')。文本(cookie);});服务器代码:

Cookie=新http cookie ('testjsread ',httputility.urlencode('明朝1368 '));回应。饼干.添加(饼干);下载文件名乱码问题

有时候我们需要在程序运行时动态创建文件,让用户下载程序运行时生成的文件。但是,有时用户会要求程序生成一个默认文件名,方便他们保存。此时,我们只需要设置内容处置响应头并给出一个默认文件名。

一般来说,只要我们让默认的下载文件名是英文和数字,问题就永远不会出现。但是,有时候用户可能会要求默认文件包含汉字,最后就会出现问题。请参见以下代码:

public void process request(HttpContext上下文){ byte[]FileContent=GetFileContent();语境。响应。内容类型=“应用程序/八位字节流”;String downloadName='ClownFish性能测试结果。xlsx ';字符串头值=字符串。格式('附件;filename='{0} ',download name);语境。响应。添加标题(“内容处理”,标题值);语境。响应。输出流。写入(文件内容,0,文件内容。长度);}这段代码可以在我的火狐、Opera、Safari、Chrome中正常运行,火狐显示的下载对话框也是我所期待的:

不幸的是,在我的IE8中是这样的:

对于这个乱码问题,我们需要稍微修改一下代码:

String downloadName='ClownFish性能测试结果。xlsx ';if(上下文。请求. browser . browser==' IE ')download name=Httputity。UrlPathEncode(download name);此时IE显示的文件名没有乱码。

注意:我的机器环境是Windows Server 2003 SP2,用于测试的浏览器版本是:

多语言数据的加扰

目前还有一个乱码问题:同一程序被不同字符集(语言)的用户使用。例如,当程序为简体中文时,繁体中文用户无法保存繁体中文字符(即使简体中文字符可以正常显示)。

当发现这种现象时,需要检查数据库的字段类型是Unicode还是UTF-8,因为当数据字段的字符集不支持多种语言时,必然会出现乱码的问题。

我建议在使用SQL SERVER时,所有保存文本的字段都应该使用以n开头的类型,例如nvarchar、nchar,并且有必要使用数据类型char(xxx),除非您清楚地知道要保存邮政编码或md5值。同样,在MySQL中,我推荐UTF-8

乱码问题概述

ASP.NET的乱码问题通常与两个因素有关:

1.选择了不正确的字符编码,例如gb2312

2.选择了不正确的网址编码方法,如转义符()

因此,解决方案并不难:

1.选择utf-8进行字符编码,包括文件编码、请求/响应编码和数据库字段类型。

2.URL的编码方式选择encodeURIComponent,强烈建议再次直接使用JQuery

我一直认为正确的方法可以帮助我在无形中避免很多问题。

如果你还在担心乱码,我建议你想想自己是否选择了不正确的编码。

单击此处下载示例代码:演示

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

更多资讯
游戏推荐
更多+