js与ASP.NET 中文乱码问题

1. 客户端 -> 服务端的问题
1.1. get 方式提交短数据效率比 post 方式高
原因:个人感觉
1.2. post 方式提交时,若数据中含有中文,则服务端获得的数据中文部分会变为乱码
原因:  可能是提交时 XMLHttpRequest 自动对非标准 ASCII 字符进行了编码。
     可能只是简单的逸码转换,但具体编码方式不详, 在服务端就很难还原。
解决:(a) 在客户端提交前,对串中的非标准 ASCII 字符用 escape() 手动转码。
     这种方法对非标码位置比较有规律(比如存放在不同的变量中)的情况比较合适。
     在服务端获取后无须用 unescape() 转换即可正常处理。
   (b) 对非标码多而不方便分别 escape() 的,可以用 encodeURI() 两次(是两次,不是一次)。
     服务端获取后用 decodeURI() 一次即得到原正确内容。
疑惑:
     以上两个解决方法经测试都正确可行。
     有个疑惑就是,浏览器在提交数据的时候,看起来是对非标码进行了一次转换,
     而在服务端获取时(如 Request(), getAttribute() 等),看起来又偷偷进行了一次逆向转换。
     而这两次转换似乎没有遵循同样的标准,从而对非标码的默认转换会导致取不到正确的内容。
     而在客户端 escape() 后,服务端的逆转换结果就是正确的。可惜 escape() 会对串中的所有可转换
     字符都进行转换,而标准 ASCII 码转换后,在服务端取出来又成了错的了(神奇....)。
     所以 escape() 仅适合用来转非标码。
     终极解决方案就是,在客户端进行连续的两次 encodeURI()。
     这个规律是从分析服务端转码后的结果串得到的。
     比如‘中'字,在 encodeURI() 一次后被转码为‘%E4%B8%AD',而在服务端手动进行一次
     decodeURI() 却得到了乱码,猜想会不会是 Request() 偷偷进行那一次转码把不该转的重要标志
     ‘%'也转掉了,于是在客户端多做一次 encodeURI(),此时‘中'字的转码结果就成了
     ‘%25E4%25B8%25AD',25h 恰好便是‘%',这样一来,服务端偷转一次,把‘%25'解为
     ‘%',再由手动 decodeURI() 转的时候,串已经变成了‘%E4%B8%AD',这样就得到了正确的
     内容。
     好像没有说清楚,不过我是明白了,希望以后忘掉的时候也能再看懂。
2. 服务端 -> 客户端的问题
2.1. 回转含有中文的数据时,客户端收到的是乱码
原因:  肯定是页面编码的问题,因为我的前提就是不强求使用统一的编码,所以这个问题要解决。
解决:  太简单,只需要在服务端向客户端回写数据前任何地方设置 Response.Chartset = "gb2312" 即可,
     不需要像很多讨论到的要转码甚至有人写出大段的转码程序,当然,客户端如果是别的编码方式,
     改一下就行了。
2.2. 客户端用 JSON 方式处理接收数据时,eval() 函数不能正确地把收到的数据解释为代码片段
     比如用 var obj = eval( "{ p1:1, p2:2 }" ) 这样的形式,obj 是不能正确被初始化为对象实例的,而是会
     收到一个缺少分号的错误,而用 eval( "var obj = { p1:1, p2:2 }" ) 这样的形式,就能正确地生成一个
     obj 的有效对象实例。
     其实仔细想一下,似乎也对,eval() 并不是如书上所讲,直接把串作为代码的一部分插入到整个代码
     段中,而是返回转入的表达式的值,而以‘{...}'的形式定义的空函数对象,其表达式值本身是
     undefined,而若其中成员多于一个,则此表达值根本不能作为合法语法独立存在,所以才会报错;
     而后一种形式,其实质其实是一个赋值表达式,虽然前缀了 var 会导致整个表达式值为 undefined,
     但此过程中却真实地生成了 obj 对象实例。在之后的上下文中引用 obj 就是有效的了。
     经过实验看来,书上和部分前辈文章提到的第一种用法,其实是不能正确工作的,至少在我的机器
     上,它确实失败了。当然,不能不考虑有可能是我的浏览器甚至是 OS 本身的原因,这个就深了。
     解决:不管有多深,问题总是要解决的。也很简单,只需要按第二种形式,把接收变量的定义一起放
     到 eval() 中,即可正常工作。
     另外,回转 JSON 数据时,也要考虑B/S双方编码问题,如果不一致,按 2.2 中的方法即可解决。
     很重要的一点是,有时候 debug 或 trace 出来的结果,特别是字符串,看起来确实是正确的,但就
     是不能正常工作,那时候就需要从编码的层次去验证,而不要仅仅考虑代码本身逻辑的问题。因为有
     些非打印编码,在 debug 和 trace 时都是不会被回显到屏幕上的。“眼见非实”,这一点,在任何
     地方永远适用。
综合感受
     Ajax 作为一种技术,其本身并无先进之处,相反过多地依赖和信仰会令其成为开发中的累赘,大量
     的精力耗费在基础工作中,思路游离于业务逻辑之外,这是一件好事,可以令你的工作更快地以失败
     告终。
     但,Ajax 作为一种思想,反而是值得推崇的,这种思想,早已经由卖童装的美特斯邦威作出了精辟
     的概括——不走寻常路。
     数年来,在世界各地,
     有 80% 的开发人员没有想到在 submit 之外去找路,他们是幸福的,他们走在一条熟悉的路上。
     另外 10% 的人走在了 iframe 的路上,他们是幸运的,他们找到了一条风景更加美好的路。
     另外 8% 的人在草丛中发现了 XMLHttpRequest,他们是值得尊敬的,他们替人们找到了新的路。
     另外 2% 的人把这条新路命名为 Ajax,他们是伟大的,他们替人们找到了加班到累死的理由。

(0)

相关推荐

  • asp.net url传递后地址栏乱码(中文超过两个汉字)

    编码编好的url是正确的,可传到另一个页面 就会出错,在地址栏就已经乱码了 1.设置web.config文件 复制代码 代码如下: <system.web> <globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" /> </system.web&g

  • .net从服务器下载文件中文名乱码解决方案

    从服务器下载文件中文名乱码解决方案,具体文字说明不多了,直接贴代码了,具体代码如下: try { string excelName = Request["excelName"].ToString(); //文件路径 string fileName = Request["fileName"].ToString(); //下载的文件名 if(!(string.IsNullOrEmpty(excelName)|| string.IsNullOrEmpty(fileName

  • asp.net URL中包含中文参数造成乱码的解决方法

    问题: 前段时间,在系统中做了一个类似于友情链接的功能块,一直运行良好,直到有一天加了类似于以下的链接地址:http://www.****.com/user.aspx?id=水天,就出现大问题了: 1.从IE地址栏中直接输入这个地址,访问没错: 2.做一个静态页,其中包括这个超链接,点击访问也没错: 3.就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码. 一开始,被这个问题也搞得头大,在google了一把后,总算是把问题给搞清楚了,其实只要这个链接地址不经过任何编码传递是不会有问题的

  • asp.net导出Excel显示中文乱码的解决方法

    复制代码 代码如下: protected void btnExcel_Click(object sender, EventArgs e)    {        List<bUFlow.Model.orderhistory> orderlist = dal.GetOrderList2("");        string filename = "3g流量网龄升级计划用户表";        string name1 = filename;       

  • asp.net Cookie值中文乱码问题解决方法

    cookie里面不能写中文,是由于cookie先天的编码方式造成的.所以需要有一种中间编码来过渡. URLEncode是最好的选择. 我们以asp.net为例,代码如下: 设置Cookie时: 复制代码 代码如下: HttpCookie cookie = new HttpCookie("name", System.Web.HttpContext.Current.Server.UrlEncode("我们")); Response.Cookies.Add(cookie)

  • asp.net下cookies的丢失和中文乱码

    我昨天晚上在做相册的时候突然又发现,iis下cookies里的中文又出现问题了,显示乱码. 费了好一段时间,才解决: //写入cookies时 string t =HttpUtility.UrlEncode(要写入到cookies的中文值); HttpCookie c = new HttpCookie("user_realname", t); Response.Cookies.Add(c); //读取cookies时 t=获取的中文cookies值; t = HttpUtility.U

  • ASP.NET中Request.Form中文乱码的解决方法

    背景 涉及到两个网站的通信,网站A有一页面a,用提交表单的方式,传值到网站B的页面b.网站A统一用UTF-8编码,网站B统一用GB2312编码. web.config中编码的设置 网站A:<globalization requestEncoding="UTF-8" responseEncoding="UTF-8" /> 网站B:<globalization requestEncoding="gb2312" responseEnc

  • .Net获取URL中文参数值的乱码问题解决方法总结

    本文总结分析了.Net获取URL中文参数值的乱码问题解决方法.分享给大家供大家参考,具体如下: 解决方法: 1.设置web.config文件 <system.web> <globalization requestEncoding="gb2312" responseEncoding="gb2312" culture="zh-CN" fileEncoding="gb2312" /> </system.

  • .NET中文乱码的解决方法分享

    前言:最近升级一个由VS05开发的项目,当迁移至VS10后,试运行,啊~!我文盲了,怎么一个汉字都不认识了!(乱码纷纷的说) 说明:本文以将项目改为UTF8编码为例. 解决之道 1.修改配置文件 复制代码 代码如下: <globalization requestEncoding="UTF-8" responseEncoding="UTF-8"  responseHeaderEncoding="UTF-8"/> ≯这步没解决,Next!

  • asp.net 中文字符串提交乱码的解决方法

    调试的时候发现老是提示用户名不存在.于是我在后台直接输出我传递进去的用户名,发现输出来的全部是乱码.看来是编码的问题,于是百度了一下,发现其实只需要一行语句就能轻松搞定了: 在Web.config中的<system.web>节点里添加如下语句: <globalization requestEncoding="GB2312" responseEncoding="GB2312"/> 然后进系统再调试,搞定...

随机推荐