热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

js与ASP.NET中文乱码问题

本文摘自一位哥们的QQ空间里,自认为方案比较可行,也确实解决了开发中的这一类问题,非原创,写在此是为以后自己能方便的找到,也希望对其他的朋友有帮助。
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,他们是伟大的,他们替人们找到了加班到累死的理由。
推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • 查询单个functionquery(id){$.ajax({url:smallproductServlet,async:true,type:POST,data:{typ ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
author-avatar
枝玫焰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有